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

Jeśli posiadam polecenie insert takie jak:

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

Jak ustawić @var INT na wartość tożsamości nowego wiersza (wywołaną Id) używając klauzuli OUTPUT? Widziałem próbki wkładania INSERTED.Name do zmiennych tabeli, na przykład, ale nie mogę dostać go do zmiennej nie-tabeli.

Próbowałem OUPUT INSERTED.Id AS @var, SET @var = INSERTED.Id, ale żadne z nich nie zadziałało.

Author: johnnyRose, 2012-06-12

1 answers

Nowo wstawiony identyfikator może być wysyłany 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ż z np. C#, gdy potrzebujesz odzyskać ID do aplikacji wywołującej-po prostu wykonaj zapytanie SQL z .ExecuteScalar() (zamiast .ExecuteNonQuery()), aby odczytać wynikowe ID z powrotem.

Lub jeśli chcesz przechwycić nowo wstawione ID wewnątrz T-SQL( np. do późniejszego dalszego przetwarzania), musisz utworzyć zmienną tabelkową:

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żna umieścić wiele wartości do @OutputTbl i dalej je przetwarzać. Możesz również użyć" zwykłej "tabeli tymczasowej (#temp) lub nawet" rzeczywistej "tabeli trwałej jako" docelowego wyjścia".

 495
Author: marc_s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-12 13:48:01