如何使用INSERT语句的OUTPUT子句获取标识值?

Yat*_*rix 220 sql sql-server-2005 insert

如果我有一个插入语句,例如:

INSERT INTO MyTable
(  
  Name,
  Address,
  PhoneNo
)
VALUES
(
  'Yatrix',
   '1234 Address Stuff',
   '1112223333'
)
Run Code Online (Sandbox Code Playgroud)

如何使用OUTPUT子句设置@var INT新行的标识值(被调用Id)?例如,我已经看过将INSERTED.Name放入表变量的示例,但我无法将其转换为非表变量.

我试过了OUPUT INSERTED.Id AS @var,SET @var = INSERTED.Id但都没有奏效.

mar*_*c_s 431

您可以将新插入的ID输出到SSMS控制台,如下所示:

INSERT INTO MyTable(Name, Address, PhoneNo)
OUTPUT INSERTED.ID
VALUES ('Yatrix', '1234 Address Stuff', '1112223333')
Run Code Online (Sandbox Code Playgroud)

当您需要将ID返回到调用应用程序时,您也可以使用例如C#,只需执行SQL查询.ExecuteScalar()(而不是.ExecuteNonQuery())来读取结果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')
Run Code Online (Sandbox Code Playgroud)

这样,您可以将多个值放入其中@OutputTbl并对其进行进一步处理.您也可以#temp在此处使用"常规"临时表()甚至"真实"持久表作为"输出目标".

  • 您可以将结果插入到"真正的持久表"中 - 这非常棒,因为这意味着您可以同时在"TWO"表中"插入"信息. (10认同)
  • 不要使用@@ IDENTITY从顶部拉出来.尝试使用触发器的困难方法,因为他们记录了对一个表所做的更改的历史记录并同时插入到新表中@@ IDENTITY开始从历史记录表中返回值.从那里开始欢闹!请使用marc_s'解决方案.暂时我使用@OutputTbl方法,但我对其他选项很感兴趣. (4认同)
  • OUTPUT INTO非常精彩,除了"OUTPUT INTO子句的目标表不能位于(主键,外键)关系的任何一侧",这对我来说是大约99%的潜在用例.我假设这是因为OUTPUT子句甚至可以在事务回滚时返回数据,但是有点烦人的是很难将数据插入相关表A和B中. (4认同)
  • @EricBishard`SCOPE_IDENTITY()`对此效果更好。 (3认同)
  • 这里的代码答案简洁明了.执行标量()FTW (2认同)
  • 我相信它的范围仅限于您的连接,根据我的经验,我从未让它从不同的操作返回 ID。不过,YMMV。 (2认同)