2012-06-12 76 views
163

如果我有一個INSERT語句,如:如何使用INSERT語句的OUTPUT子句獲取標識值?

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

如何設置@var INT到新行的標識值使用OUTPUT子句(稱爲Id)?例如,我已經看到了將INSERTED.Name放入表變量中的示例,但我無法將其變爲非表變量。

我試過OUPUT INSERTED.Id AS @var,SET @var = INSERTED.Id,但都沒有工作。

+2

我已經知道@@ SCOPE_IDENTITY了,我特別想知道如何用OUPUT來做到這一點。謝謝。 – Yatrix

+6

您需要將其插入到表變量中,然後從中選擇。沒有語法可以直接從'OUTPUT'子句中分配標量變量。 –

+3

[OUTPUT子句](http://msdn.microsoft.com/en-us/library/ms177564.aspx)必須輸出到表或表變量中。 – mellamokb

回答

320

您可以有新插入的ID被輸出到SSMS控制檯這樣的:

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

。也可以使用這從例如C#,當您需要將ID返回給您的調用應用程序時 - 只需執行.ExecuteScalar()(而不是.ExecuteNonQuery())的SQL查詢即可讀取返回的結果ID

或者,如果您需要捕獲新插入的ID裏面的T-SQL(例如,用於以後進一步的處理),你需要創建一個表變量:

DECLARE @OutputTbl TABLE (ID INT) 

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

這種方式,可以把多個值成@OutputTbl並對這些進行進一步處理。您也可以在這裏使用「常規」臨時表(#temp)甚至是「真正的」持久表作爲您的「輸出目標」。

+2

這裏代碼的答案很簡潔。 ExecuteScalar()FTW –

+5

您可以將結果插入到「真實持久表」中 - 這非常棒,因爲這意味着您可以同時在「TWO」表中「插入」信息。 – gotqn

+2

永遠不要使用@@ IDENTITY從頂部拉。發現使用觸發器的難題,並且記錄了對一個表進行更改的歷史記錄,並同時插入到一個新表中@@ IDENTITY開始從歷史記錄表中返回值。隨之而來的是歡鬧!請使用marc_s'解決方案。暫時我已經用@OutputTbl方法去了,但我對其他選項很感興趣。 –