如何在将表的子集插入自身时获取新的pk和旧的pk?

时间:2012-06-13 20:33:42

标签: sql-server tsql

我正在将一个表的子集插入到同一个表中,并且为了在一些映射表中创建记录,需要捕获新创建的身份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表。

我是否有某种方法可以实现这一目标,(无需一次使用一条记录 接近或不得不锁定整个表格??

谢谢, 伊尔玛

1 个答案:

答案 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