如何克隆表中的记录并了解新旧ID?

时间:2010-07-20 03:52:53

标签: sql sql-server sql-server-2005

我想在一个表中复制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上。

干杯 马修

2 个答案:

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