【问题标题】:How do I use an INSERT statement's OUTPUT clause to get the identity value?如何使用 INSERT 语句的 OUTPUT 子句获取标识值?
【发布时间】:2012-06-12 15:03:49
【问题描述】:

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

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

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

我试过OUPUT INSERTED.Id AS @varSET @var = INSERTED.Id,但都没有成功。

【问题讨论】:

  • 我已经知道@@SCOPE_IDENTITY,我特别想知道如何使用 OUPUT 来做到这一点。谢谢。
  • 您需要将其插入到表变量中,然后从中进行选择。没有语法可以直接从 OUTPUT 子句分配给标量变量。
  • OUTPUT clause 必须输出到表或表变量中..
  • OUTPUT 子句写入表。可以是表变量,临时表,...。
  • 我的问题专门询问 OUTPUT 子句。

标签: sql sql-server-2005 insert


【解决方案1】:

您可以像这样将新插入的 ID 输出到 SSMS 控制台:

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

您也可以使用它,例如C#,当您需要将 ID 取回给您的调用应用程序时 - 只需使用 .ExecuteScalar()(而不是 .ExecuteNonQuery())执行 SQL 查询以读取结果 ID

或者如果您需要在 T-SQL 中捕获新插入的ID(例如用于以后进一步处理),则需要创建一个表变量:

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) 甚至“真实”持久表作为“输出目标”。

【讨论】:

  • 后面代码的答案很简洁。 ExecuteScalar() FTW
  • 您可以在real persistent table 中插入结果——这非常棒,因为这意味着您可以同时在TWO 表中提供INSERT 信息。
  • 永远不要使用@@IDENTITY 从顶部拉取。找到了使用触发器的艰难方法,因为它们记录了对一个表所做的更改历史并同时插入到一个新表中@@IDENTITY 开始从历史表中返回值。欢闹由此而来!请使用 marc_s 的解决方案。目前我使用了@OutputTbl 方法,但我对其他选项很感兴趣。
  • OUTPUT INTO 非常棒,除了“OUTPUT INTO 子句的目标表不能位于(主键、外键)关系的任何一侧”,这对我来说是大约 99% 的潜力用例。我假设这是因为即使事务回滚,OUTPUT 子句也可以返回数据,但是有点烦人,很难一次性将数据插入到相关表 A 和 B 中。
  • @EricBishard SCOPE_IDENTITY() 效果更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
相关资源
最近更新 更多