我编写了一个MERGE
用于在表中插入/更新数据的过程,但这是我的问题。在ID
上表的列,这也是主键列不是一个IDENTITY
列。我找到了一种插入数据的方法,但是有可能在我不想要的PK中造成差距。
这是我目前有效的代码。
MERGE Table p
USING (SELECT i.Col1,
i.Col2,
i.Col3,
(SELECT ISNULL(MAX(ID), 0) FROM Table1 i) +
ROW_NUMBER() OVER (ORDER BY ID) ID
) a(Col1, Col2, Col3, ID)
ON p.Col1 = a.Col1
WHEN MATCHED THEN UPDATE set p.Col2 = a.Col2, p.Col3 = a.Col3
WHEN NOT MATCHED THEN INSERT (ID, Col1, Col2, Col3)
VALUES (a.ID, a.Col1, a.Col2, a.Col3)
该ROW_NUMBER() OVER (ORDER BY ID)
会给我唯一的值,但如果在20个记录10被更新,它会在其它嵌在我的ID列上创建的空白。
我试过了
(Select ISNULL(MAX(ID), 0) + 1 from Table)
但显然只有在插入1条记录的情况下,此方法才能正常工作。批量操作不会为每个insert语句执行子查询,这会导致PK违规。
我无法将ID
列更改为列,identity
因为旧版应用程序仍将信息插入该表中,并且如果将其更改为身份列将失败。
有人可以给我另一种执行合并的方法,而不必遍历整个表并分别执行每个更新/插入吗?
一种简单的解决方案是分两步合并。在第一步中,更新现有行。在第二步中,插入新行。由于第二步仅插入,因此避免了间隙问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句