ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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 子句。

m
marc_s

您可以将新插入的 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() 对此效果更好。