2012-11-15 23 views
16

Zaimportuję wiele wierszy danych z pliku csv do bazy danych SQL Server (za pośrednictwem aplikacji internetowej). Potrzebuję wygenerowanej automatycznie wartości identyfikatora dla klienta.Czy istnieje sposób użycia SCOPE_IDENTITY, jeśli używana jest instrukcja wielokrotnego wstawiania?

Jeśli robię to w pętli, wydajność jest bardzo zła (ale mogę bez problemu używać SCOPE_IDENTITY()).

bardziej wydajnych rozwiązaniem byłoby sposobem tak:

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

Czy istnieje jakiś sposób, aby uzyskać wszystkie wygenerowane identyfikatory, a nie tylko ostatni wygenerowany id?

Dzięki za pomoc!

poważaniem, Thorsten

+5

Nie, 'SCOPE_IDENTITY()' daje tylko ** jedną, ostatnią ** wstawioną wartość "TOŻSAMOŚCI". Ale możesz sprawdzić klauzulę "WYJŚCIA" SQL Server .... –

+0

Komentarz do usuniętej odpowiedzi: Myślę, że powinieneś usunąć pierwszą linię i zmienić trzecią linię na 'sqlBuilder.Append (" OUTPUT INSERTED.autoid "); '. Nie ma potrzeby umieszczania danych wyjściowych w zmiennej tabeli, jeśli chcesz wyprowadzać dane wyjściowe do kodu klienta. –

Odpowiedz

33

Nie, SCOPE_IDENTITY() daje tylko jedną, ostatnią wstawiony wartość IDENTITY. Ale można 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') 

Po uruchomieniu wyciągu INSERT zmienna tabela będzie posiadać jakąś wartość klucza „” (dla ciebie, aby zidentyfikować wiersz) i nowa ID wartości każdy wiersz włożony. A teraz zwariuj! :-)

+0

Dzięki temu spróbuję. –

+0

Czy istnieje ryzyko, jeśli wielu użytkowników będzie pracować na tym samym stole - czy mogą uzyskać błędne identyfikatory (innych użytkowników)? –

+0

@ThorstenKraus: nie, każda transakcja otrzymuje tylko własne wartości wstecz –