2012-01-07 8 views
5

Mam tabelę, w której muszę skopiować określone wiersze. Mogę identyfikatory nowych wierszy tak:Jak skopiować wiersze z SQL i uzyskać nowe i stare identyfikatory jako wynik?

DECLARE @IDs TABLE (ID int) 
INSERT T (name, address) 
OUTPUT INSERTED.TID INTO @ids 
    SELECT name, address 
    FROM T 

Ale co chciałbym mieć to coś takiego:

DECLARE @IDs TABLE (oldID int, newID int) 
INSERT T (name, address) 
OUTPUT T.ID, INSERTED.TID INTO @ids 
    SELECT name, address 
    FROM T 

Można to zrobić z SQL Server?

P.S. Nie robię tego programistycznie, ponieważ musi to być wykonane przez procedurę przechowywaną.

+2

możliwe duplikat [Jak skopiować tabele unikając kursorów w SQL?] (Http : //stackoverflow.com/questions/6174355/how-to-copy-tables-avoiding-cursors-in-sql) –

+1

Zasadniczo zbadaj [to pytanie] (http://stackoverflow.com/questions/5365629/using- merge-output-to-get-mapping-between-source-id-and-target-id "Korzystanie z polecenia merge..output w celu uzyskania mapowania między source.id a target.id") * Sekcja * Linked *: wiele pytania link do niego, a wiele z nich jest podobnych do twoich. –

+2

To nie ma większego sensu. Dla wstawionego wiersza nie byłoby "starego" identyfikatora. Czy mówisz o aktualizacjach? –

Odpowiedz

5

z pomocnymi linkami z Andriy M 'linku s do' How to copy tables avoiding cursors in SQL?”, udało mi się wymyślić to bardzo eleganckie rozwiązanie:

DECLARE @t TABLE (oID int, nID int); 

MERGE T s 
USING (
     SELECT TID, name, address 
     FROM T [s] 
    ) d on 0 = 1 
WHEN NOT MATCHED 
THEN INSERT (name, address) 
    VALUES (name, address) 
OUTPUT d.TID as oID, Inserted.TID as nID 
INTO @t; 
+0

Nie wiem, dlaczego to nie jest wyższe, jest bardzo przydatne, dziękuję. Byłoby łatwiej czytać z bardziej opisowymi nazwami var. :) 'T s' może być' MyTable tblTo', 'T [s]' just 'MyTable', a' d' może być 'tblFrom'. –

Powiązane problemy