Как я могу клонировать записи в таблице и узнать новый и старый идентификатор? - PullRequest
0 голосов
/ 20 июля 2010

Я хочу скопировать N записей в таблице, что легко с INSERT SELECT, однако после вставки мне нужен список, показывающий oldId и newId. Допустим, у меня есть оператор SELECT, который возвращает:

ID | Name
3  | Test A
4  | Test B
5  | Test C

Если я делаю SELECT INTO из этого, он вставляет 3 новых PK. Мне нужен список, показывающий новые и старые идентификаторы, например

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()

И я не могу присоединить таблицу к себе, потому что «Имя» не уникально, поэтому я ищу какую-то встроенную функцию SQL. Это, вероятно, не возможно, но думал, что я спрошу.

Я нахожусь на SQL Server 2005.

Приветствие Matthew

Ответы [ 2 ]

2 голосов
/ 20 июля 2010

Вы можете вывести новые идентификаторы, используя предложение output. Но он не может выводить столбцы, которые вы не вставляете, как идентификатор в старой таблице.

Одним из способов решения этой проблемы является добавление столбца 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 голос
/ 20 июля 2010

Если вы хотите сохранить предыдущий PK в таблице, вы можете отобразить оба идентификатора с помощью предложения OUTPUT :

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...