Jak użyć klauzuli OUTSUT instrukcji INSERT, aby uzyskać wartość tożsamości?


240

Jeśli mam instrukcję wstawiania, taką jak:

INSERT INTO MyTable
(  
  Name,
  Address,
  PhoneNo
)
VALUES
(
  'Yatrix',
   '1234 Address Stuff',
   '1112223333'
)

Jak ustawić @var INTwartość tożsamości nowego wiersza (wywoływaną Id) za pomocą klauzuli OUTPUT? Widziałem na przykład przykłady wstawiania INSERTED.Name do zmiennych tabelowych, ale nie mogę umieścić ich w zmiennej innej niż tabelowa.

Próbowałem OUPUT INSERTED.Id AS @var, SET @var = INSERTED.Idale nie pracowali.


3
Wiem już o @@ SCOPE_IDENTITY, szczególnie chcę wiedzieć, jak to zrobić za pomocą OUPUT. Dzięki.
Yatrix

6
Musisz wstawić go do zmiennej tabeli, a następnie wybrać jedną z nich. Nie ma składni przypisywanej bezpośrednio do zmiennej skalarnej z OUTPUTklauzuli.
Martin Smith

3
Punkt WYJŚCIE ma wyjście do zmiennej stołowego i ..
mellamokb

5
OUTPUTKlauzula pisze do stołu. Może to być zmienna tabeli, tabela tymczasowa, ...
HABO,

2
Moje pytanie dotyczy konkretnie klauzuli OUTPUT.
Yatrix 30.09.16

Odpowiedzi:


464

Możesz wstawić nowo wstawiony identyfikator do konsoli SSMS w następujący sposób:

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

Możesz użyć tego również np. Z C #, gdy musisz odzyskać identyfikator do aplikacji wywołującej - po prostu wykonaj zapytanie SQL za pomocą .ExecuteScalar()(zamiast .ExecuteNonQuery()), aby odczytać wynikowy IDpowrót.

Lub jeśli chcesz przechwycić nowo wstawiony IDwewnątrz T-SQL (np. Do późniejszego dalszego przetwarzania), musisz utworzyć zmienną tabelową:

DECLARE @OutputTbl TABLE (ID INT)

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID INTO @OutputTbl(ID)
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')

W ten sposób możesz umieścić wiele wartości @OutputTbli wykonać na nich dalsze przetwarzanie. Możesz również użyć „zwykłej” tabeli tymczasowej ( #temp) lub nawet „prawdziwej” tabeli trwałej jako „docelowego wyniku” tutaj.


2
Tutaj odpowiedź na kod był zwięzły. ExecuteScalar () FTW
Joe Johnston

10
Możesz wstawić wynik do real persistent table- jest to wyjątkowo fantastyczne, ponieważ oznacza to, że możesz jednocześnie INSERTinformacje w TWOtabelach.
gotqn

7
Nigdy nie używaj @@ TOŻSAMOŚCI do ściągania z góry. Poszedłem ciężko pracując z wyzwalaczami, a ponieważ rejestrowali historię zmian dokonanych w jednej tabeli i jednocześnie wstawiali do nowej tabeli @@ IDENTITY zaczęło zwracać wartości z tabeli historii. stamtąd pojawia się wesołość! Proszę użyć rozwiązania marc_s. na razie korzystam z metody @OutputTbl, ale intrygują mnie inne opcje.
Eric Bishard,

4
OUTPUT INTO jest niezwykle fantastyczny, z wyjątkiem tego, że „Tabela docelowa klauzuli OUTPUT INTO nie może znajdować się po żadnej stronie relacji (klucz podstawowy, klucz obcy)”, co dla mnie stanowi około 99% potencjalnych przypadków użycia. Zakładam, że dzieje się tak, ponieważ klauzula OUTPUT może zwrócić dane nawet po wycofaniu transakcji, ale jest to trochę denerwujące, że tak trudno jest wstawić dane do powiązanych tabel A i B za jednym razem.
Robert Calhoun,

3
@EricBishard SCOPE_IDENTITY()działa na to lepiej.
Derreck Dean
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.