2012-11-15 10 views
16

Importerò molte righe di dati da un file csv in un database SQL Server (tramite un'applicazione web). Ho bisogno del valore ID generato automaticamente per il client.Esiste un modo per utilizzare SCOPE_IDENTITY se si utilizza un'istruzione di inserimento multiplo?

Se faccio questo in un ciclo, le prestazioni sono pessime (ma posso usare SCOPE_IDENTITY() senza problemi).

Una soluzione più performante sarebbe un modo come questo:

INSERT INTO [MyTable] 
VALUES ('1'), ('2'), ('3') 
SELECT SCOPE_IDENTITY() 

C'è un modo per ottenere tutti gli ID generati e non solo l'ultimo ID generato?

Grazie per il vostro aiuto!

Con i migliori saluti, Thorsten

+5

No, 'SCOPE_IDENTITY()' fornisce solo il valore **, l'ultimo ** inserito 'IDENTITY'. Ma è possibile controllare la clausola 'OUTPUT' di SQL Server .... –

+0

Commento alla risposta cancellata: Penso che dovresti rimuovere la prima riga e cambiare la terza riga in' sqlBuilder.Append ("OUTPUT INSERTED.autoid"); '. Non è necessario inserire l'output in una variabile di tabella se si desidera l'output sul codice client. –

risposta

33

No, SCOPE_IDENTITY() si dà solo l'uno, ultima inserita IDENTITY valore. Ma si potrebbe check out the OUTPUT clause of SQL Server ....

DECLARE @IdentityTable TABLE (SomeKeyValue INT, NewIdentity INT) 

INSERT INTO [MyTable] 
OUTPUT Inserted.Keyvalue, Inserted.ID INTO @IdentityTable(SomeKeyValue, NewIdentity) 
VALUES ('1'), ('2'), ('3') 

Dopo aver eseguito la sua dichiarazione INSERT, la variabile tavolo conterrà "un po 'di valore chiave" (per voi, per identificare la riga) e le appena inseriti ID valori per ogni riga inserita. Ora impazzisci con questo! :-)

+0

Grazie, ci proverò. –

+0

C'è qualche rischio se più utenti lavorano sulla stessa tabella - possono avere id sbagliati (degli altri utenti)? –

+0

@ThorstenKraus: no, ogni transazione restituisce solo i propri valori –