我编写了一个使用MERGE
在表中插入/更新数据的过程,但这是我的问题。表中也是主键列的ID
列不是IDENTITY
列。我找到了一种插入数据的方法,但是我有可能在PK中创建我不想要的空白。批量插入到SQL表中,并使用唯一标识列不是标识
这是我的代码,目前的作品。
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被插入的记录,这只会正常工作。批量操作不会为每个插入语句执行子查询,并且会导致PK违例。
我无法将ID
列更改为identity
列,因为遗留应用程序仍会将信息插入到该表中,并且如果将其更改为标识列,将会失败。
任何人都可以给我另一种方法来做合并,而不必遍历整个表执行每个更新/插入单独?
'IDENTITY'字段也有差距。这不是你应该关心的问题。 – OGHaza
这个查询不能工作,别名's'和'i'不映射到表 – Andomar
我的错误,我实际上有原始查询的连接。我编辑了问题 – Jaques