2012-06-12 98 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方法去了,但我对其他选项很感兴趣。 –