Tsql 使用插入后的输出将标识列的值获取到(非表值)变量中

Tsql 使用插入后的输出将标识列的值获取到(非表值)变量中,tsql,sql-server-2008,sql-server-2008-r2,Tsql,Sql Server 2008,Sql Server 2008 R2,给出以下简单的测试表: CREATE TABLE dbo.Test ( Id bigint IDENTITY(1,1) NOT NULL, Name varchar(50) NULL ) 我想使用OUTPUT子句将identity列的值放入INSERT之后的标量变量中,但这不起作用: DECLARE @InsertedId BIGINT; INSERT INTO Test(Name) OUTPUT @InsertedId=inserted.Id VALUES ('Micha

给出以下简单的测试表:

CREATE TABLE dbo.Test
(
  Id bigint IDENTITY(1,1) NOT NULL,
  Name varchar(50) NULL
)
我想使用
OUTPUT
子句将identity列的值放入
INSERT
之后的标量变量中,但这不起作用:

DECLARE @InsertedId BIGINT;

INSERT INTO Test(Name) 
  OUTPUT @InsertedId=inserted.Id
  VALUES ('Michael')

-- Display resulting id for debugging
SELECT @InsertedId;
-- ...
我知道我可以在
INSERT
之后使用
SCOPE\u IDENTITY()
轻松实现这一点,但是否可以使用
OUTPUT
子句将其作为
INSERT
语句的一部分来实现,而无需使用表变量

更新,这是另一种不合法的人为尝试:

-- Return the id as a result set
INSERT INTO Test(Name) 
OUTPUT inserted.Id AS TheId
VALUES ('Michael')

-- But you can't use the result set as a derived table...
SELECT TheId FROM
(
  INSERT INTO Test(Name) 
  OUTPUT inserted.Id AS TheId
  VALUES ('Michael')
)

-- ..., or you would be able to do this
SELECT TOP 1 @InsertedId=TheId
FROM
(
  INSERT INTO Test(Name) 
  OUTPUT inserted.Id AS TheId
  VALUES ('Michael')
)

不,这是不可能的。OUTPUT子句只能输出到表/表变量中,或者用于标识可组合DML的列(这没有帮助)
SCOPE_IDENTITY()
一直以来,Michael。

记住output子句的值是它可以返回多个记录和多个字段。因此,可以输出一组数据的自然键和标识,也可以使用集合论将多个记录插入子表。输出功能非常强大,习惯使用它是值得的


目前,scope_identity()中存在Microsoft不打算修复的错误(请参阅链接:)。这会给你一个线索,告诉你是否应该在新的开发中使用输出,即使对于单个记录来说有点笨拙。

同意。OUTPUT子句提供了一个需要放入表中的记录集:分配给标量没有任何意义variable@gbn:不过,可以使用OPENQUERY读取记录集。当然,这需要将服务器设置为链接服务器。我给了你一个+1来确认我的信念,但HLGEM得到了一个复选标记,基本上确认了“只有”输出暂时应该使用的事实。@Michael-谢谢Michael。我没有意识到SCOPE_IDENTITY()bug——但我不会马上忘记它——真是令人震惊+1-这太令人震惊了(scope_identity()中的bug),甚至更令人震惊,因为它不会得到修复。关于
scope_identity
bug的链接对我不起作用-我找到了他们声称对SQL Server 2008 R2 SP1有修复的地方。否则,作为一种解决方法,他们建议使用
输出
,即使是单个记录