我正在将一个表的子集插入到同一个表中,并且为了在一些映射表中创建记录,需要捕获新创建的身份PK和匹配的旧PK ..
如果SQL支持它,例如:
Create table Test (pk identity, description varchar(10))
Declare @PKVALUES TABLE (NewPK int, OLdPk int)
INSERT INTO Test (description)
OUTPUT INSERTED.PK, Test.PK into @PKVALUES
Select description
From Test
Where ...
但是,当然,SQL不支持在INSERT操作期间从FROM表中输出值。
我遇到的唯一基于集合的替代方法需要在临时表中创建新PK时锁定整个表,然后使用标识插入将它们插入Test表。
我是否有某种方法可以实现这一目标,(无需一次使用一条记录 接近或不得不锁定整个表格??
谢谢, 伊尔玛
答案 0 :(得分:1)
我的偏好是添加一个列来存储旧的pk,然后你可以从output子句返回它。但是,并不总是可以更改表格。
所以,我有一个偷偷摸摸的技巧,但它涉及在你的数据库上做两倍的工作。你要做的是将旧PK放在初始插入的描述字段中。然后,通过将描述字段连接到PK,将描述更新为旧PK的值。
Create table Test (pk identity, description varchar(10))
Declare @PKVALUES TABLE (NewPK int, OLdPk varchar(10)
INSERT INTO Test (description)
OUTPUT INSERTED.PK, INSERTED.Description into @PKVALUES
SELECT PK from Test where....
UPDATE tnew
SET description = told.description
FROM test told
JOIN test tnew ON CAST(told.PK AS varchar (10)) = t.description