2

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

有什么方法可以做到这一点(不必一次使用一条记录或锁定整个表)?

谢谢,伊尔玛

4

1 回答 1

1

我的偏好是添加一个列来存储旧的 pk,然后您可以从输出子句中返回它。但是,并非总是可以更改表格。

所以,我有一个鬼鬼祟祟的把戏,但它需要在你的数据库上做两倍的工作。您所做的是将旧 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 
于 2012-06-13T21:07:28.917 回答