2012-10-12 14 views
12

Ho una tabella con una sola colonna, che è un'identità generata automaticamenteinserire più righe di valori predefiniti in una tabella

create table SingleIdTable (
    id int identity(1,1) not null 
) 

posso inserire una singola riga con un id generato automaticamente con:

insert into SingleIdTable default values 

voglio inserire molte righe e utilizzare la sintassi di uscita per ottenere il loro iD, qualcosa di simile:

insert into SingleIdTable 
output inserted.Id into @TableOfIds 
    select (default values) from SomeOtherTable where Attribute is null 

Wher L'intenzione è di inserire una riga in SingleIdTable per ogni riga in SomeOtherTable dove Attribute è null utilizzando un ID generato automaticamente. Quanto sopra non funziona, ma come potrei farlo. Prendo atto che se il mio tavolo avesse più di una singola colonna potrei farlo, ma non posso selezionare righe vuote che è quello che voglio veramente fare.

Non riesco a modificare la definizione di SomeOtherTable.

risposta

21

Se SQL Server 2008+ è possibile utilizzare MERGE per questo. Esempio di sintassi di seguito.

MERGE INTO SingleIdTable 
USING (SELECT * 
     FROM SomeOtherTable 
     WHERE Attribute IS NULL) T 
ON 1 = 0 
WHEN NOT MATCHED THEN 
    INSERT 
    DEFAULT VALUES 
OUTPUT INSERTED.id; 

Non sono sicuro di quale uso pratico abbia questo tavolo a colonna singola?

+1

+1 Mai pensato a MERGE – RichardTheKiwi

+0

Astuzia ... Il tavolo un artefatto di qualcuno che ha mal applicato NHibernate durante la mappatura di un gruppo. Lo accetterò, ma ora mi rendo conto che potrei fare correlando la query interna con l'inserto in modo che possa 'output inserted.id, SomeOtherTable.id)'. È possibile? In realtà ho solo bisogno di abbinare il mio bag di id generati ciascuno con un elemento di 'SomeOtherTable' dove 'Attribute' è null. qualche idea? – silasdavis

+0

@silasdavis - Sì, basta usare "OUTPUT INSERTED.id, T.id' –

-1

Non è possibile utilizzare SCOPE_IDENTITY() per ottenere l'ID della riga inserita? La tua domanda è un po 'vaga, puoi chiarire?

Problemi correlati