2012-06-12 12 views
163

Jeśli mam instrukcji INSERT, takich jak:Jak użyć wyrażenia OUTPUT instrukcji INSERT, aby uzyskać wartość tożsamości?

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

Jak ustawić @var INT wartości tożsamości nowego wiersza (określane Id) przy użyciu klauzula wyjście? Widziałem na przykład próbki wprowadzania INSERTED.Name do zmiennych tabeli, ale nie mogę pobrać go do zmiennej innej niż tabela.

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

+2

Wiem o @@ SCOPE_IDENTITY już, chcę wiedzieć, jak to zrobić z OUPUT. Dzięki. – Yatrix

+6

Należy wstawić go do zmiennej tabeli, a następnie wybrać z niej. Nie ma żadnej składni, która byłaby przypisana bezpośrednio do zmiennej skalarnej z klauzuli "WYJŚCIE". –

+3

Klauzula OUTPUT (http://msdn.microsoft.com/en-us/library/ms177564.aspx) musi zostać wyprowadzona do zmiennej tabeli lub tabeli. – mellamokb

Odpowiedz

320

Można posiada nowo zapisany identyfikator jest wysyłany do konsoli SSMS tak:

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

tej można użyć również z np C#, kiedy potrzebujesz odzyskać identyfikator do swojej aplikacji wywołującej - po prostu wykonaj zapytanie SQL z .ExecuteScalar() (zamiast z .ExecuteNonQuery()), aby odczytać wynikową kopię zapasową w postaci ID.

Albo, jeśli chcesz uchwycić nowo wstawiony ID wewnątrz T-SQL (na przykład dla późniejszego dalszego przetwarzania), trzeba utworzyć zmienną tabeli:

DECLARE @OutputTbl TABLE (ID INT) 

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

ten sposób można umieścić wiele wartości do @OutputTbl i wykonaj dalsze przetwarzanie. Możesz również użyć "zwykłej" tabeli tymczasowej (#temp) lub nawet "prawdziwej" tabeli trwałości jako "docelowego wyniku" tutaj.

+2

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

+5

Możesz wstawić wynik do "prawdziwej tabeli trwałej" - jest to niesamowicie fantastyczne, ponieważ oznacza to, że możesz w tym samym czasie "WSTAWIĆ" informacje w tabelach "DWIE". – gotqn

+2

Nigdy nie używaj @@ TOŻSAMOŚCI do ciągnięcia od góry. Z trudem pracowałem z wyzwalaczami, a ponieważ zapisywali historię zmian wprowadzonych do jednej tabeli i wstawili do nowej tabeli w tym samym czasie, @@ IDENTITY zaczęło zwracać wartości z tabeli historii. z tego wynika wesołość! Użyj rozwiązania marc_s. na razie poszedłem z metodą @OutputTbl, ale jestem zaintrygowany innymi opcjami. –

Powiązane problemy