在INSERT之后使用OUTPUT将identity列的值转换为(非表值)变量

Mic*_*eyn 10 t-sql sql-server-2008 sql-server-2008-r2

给出以下简单的测试表:

CREATE TABLE dbo.Test
(
  Id bigint IDENTITY(1,1) NOT NULL,
  Name varchar(50) NULL
)
Run Code Online (Sandbox Code Playgroud)

我想在INSERT使用OUTPUT子句后将标识列的值转换为标量变量,但这不起作用:

DECLARE @InsertedId BIGINT;

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

-- Display resulting id for debugging
SELECT @InsertedId;
-- ...
Run Code Online (Sandbox Code Playgroud)

我知道我可以轻松地使用SCOPE_IDENTITY()之后使用INSERT,但是可以INSERT使用该OUTPUT子句作为语句的一部分而不使用表变量吗?

更新,另一个人为的尝试也是不合法的:

-- 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')
)
Run Code Online (Sandbox Code Playgroud)

HLG*_*GEM 13

请记住,output子句的值是它可以返回多个记录和多个字段.因此,您可以输出自然键和一组数据的标识,这样您也可以使用set theory将多个记录插入子表中.输出非常强大,习惯使用它会付出代价.

目前,scope_identity()中存在一个错误(请参阅链接:http://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value)Microsoft不打算修复.这应该会告诉你是否应该使用输出进行新开发,即使它对于单个记录来说有点笨拙.

  • +1 - 这是令人震惊的(scope_identity()中的错误),甚至更多,因为它不会得到修复. (3认同)

Wil*_*l A 6

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