我正在尝试复制表中的记录并使用 SQL Server 2005 中的存储过程更改一些值。这很简单,但我还需要使用新的主键复制其他表中的关系。由于此过程用于批量复制记录,我发现很难存储旧密钥和新密钥之间的某些关系。
现在,我正在使用 OUTPUT INTO 从批量插入中获取新密钥。
前任:
INSERT INTO table
(column1, column2,...)
OUTPUT INSERTED.PrimaryKey INTO @TableVariable
SELECT column1, column2,...
有没有这样的方法可以轻松地在插入新钥匙的同时插入旧钥匙(以确保我已配对正确的相应钥匙)?
我知道光标是一种选择,但我从未使用过它们,只听到以恐怖故事的方式引用它们。我更喜欢使用 OUTPUT INTO 或类似的东西。
如果您需要跟踪临时表中的旧键和新键,则需要作弊并使用MERGE
:
数据设置:
create table T (
ID int IDENTITY(5,7) not null,
Col1 varchar(10) not null
);
go
insert into T (Col1) values ('abc'),('def');
以及你的替代品INSERT
陈述:
declare @TV table (
Old_ID int not null,
New_ID int not null
);
merge into T t1
using (select ID,Col1 from T) t2
on 1 = 0
when not matched then insert (Col1) values (t2.Col1)
output t2.ID,inserted.ID into @TV;
并且(实际上需要在同一批次中,以便您可以访问表变量):
select * from T;
select * from @TV;
生产:
ID Col1
5 abc
12 def
19 abc
26 def
Old_ID New_ID
5 19
12 26
您必须这样做的原因是因为对OUTPUT clause当与INSERT
- 您只能访问inserted
表,而不是可能属于某个表的任何表SELECT
.
相关 - 更多解释MERGE abuse
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)