我想在一个表中复制N个记录,这很容易使用INSERT SELECT,但是在插入之后我想要一个显示oldId和newId的列表。所以假设我有一个返回的SELECT语句:
ID | Name
3 | Test A
4 | Test B
5 | Test C
如果我从中执行SELECT INTO,则会插入3个新的PK。我想要一个显示新旧ID的列表,例如
3 | 49
4 | 50
5 | 51
我知道如何使用循环,游标,Scope_Identity()或临时表等进行多行代码,但是想知道是否有一种切割方法可以在一行SQL之后获取新/旧列表INSERT SELECT例如
INSERT INTO tbl(Name)
SELECT Name
FROM tbl
WHERE blah = 1
.
SELECT New_Old_Ids()
我无法将表连接到自身,因为“Name”不是唯一的,所以我正在寻找某种内置的SQL功能。这可能是不可能的,但我想我会问。
我在SQL Server 2005上。
干杯 马修
答案 0 :(得分:2)
您可以使用output
子句输出新ID。但它无法输出您未插入的列,例如旧表中的ID。
另一种方法是在目标表中添加oldid
列:
declare @src table (id int identity, name varchar(50))
declare @dest table (id int identity, name varchar(50), oldid int)
insert into @src (name) values ('John')
insert into @src (name) values ('Jason')
insert into @src (name) values ('Aasif')
insert into @dest (name) values ('Larry')
insert into @dest (name, oldid)
output inserted.*
select name, id from @src
当然,您现在也可以代替output
子句:
select id, oldid
from @dest
答案 1 :(得分:1)
如果您愿意将之前的PK存储在表格中,则可以使用以下内容显示这两个ID OUTPUT clause:
DECLARE @t TABLE (
PK INT NOT NULL IDENTITY(1,1),
Name VARCHAR(50),
PrevPK INT
)
INSERT @t (Name)
SELECT 'A' UNION ALL SELECT 'B' UNION ALL SELECT 'C' UNION ALL
SELECT 'D' UNION ALL SELECT 'E'
INSERT @t (Name, PrevPK)
OUTPUT Inserted.PK, Inserted.PrevPK
SELECT Name, PK
FROM @t t
WHERE 0=0
/** Results **/
PK PrevPK
----------- -----------
6 1
7 2
8 3
9 4
10 5