2012-01-07 20 views
5

Ho una tabella in cui ho bisogno di copiare determinate righe. Posso ottenere ID di nuove righe come questo:Come copiare righe con SQL e ottenere nuovi e vecchi ID come risultato?

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

Ma quello che mi piacerebbe avere è qualcosa di simile:

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

si può fare con SQL Server?

P.S. Non sto facendo questo programmatico, perché deve essere fatto da una stored procedure.

+2

possibile duplicato di [Come copiare le tabelle evitando cursori in SQL?] (Http : //stackoverflow.com/questions/6174355/how-to-copy-tables-avoiding-cursors-in-sql) –

+1

In pratica, esplora [questa domanda] (http://stackoverflow.com/questions/5365629/using- merge-output-to-get-mapping-between-source-id-and-target-id "Uso di merge..output per ottenere il mapping tra source.id e target.id") 's * Linked * section: un sacco di le domande si collegano ad esso, e molte sono simili alle tue. –

+2

Questo non ha molto senso. Non ci sarebbe nessun "vecchio" ID per una riga inserita. Stai parlando di aggiornamenti? –

risposta

5

Con link utili da Andriy M 'collegamento s a' How to copy tables avoiding cursors in SQL?', sono riuscito a venire con questa soluzione molto elegante:

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

Non sono sicuro del motivo per cui questo non è segnato più in alto, è molto utile, grazie. Sarebbe più facile da leggere con nomi di variabili più descrittivi. :) 'T s' potrebbe essere' MyTable tblTo', 'T [s]' solo 'MyTable', e' d' potrebbe essere 'tblFrom'. –

Problemi correlati