给出以下简单的测试表:
CREATE TABLE dbo.Test
(
Id bigint IDENTITY(1,1) NOT NULL,
Name varchar(50) NULL
)
我想使用INSERT
子句在OUTPUT
之后将标识列的值转换为标量变量,但这不起作用:
DECLARE @InsertedId BIGINT;
INSERT INTO Test(Name)
OUTPUT @InsertedId=inserted.Id
VALUES ('Michael')
-- Display resulting id for debugging
SELECT @InsertedId;
-- ...
我知道我可以在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')
)
答案 0 :(得分:13)
请记住,输出子句的值是它可以返回多个记录和多个字段。因此,您可以输出自然键和一组数据的标识,这样您也可以使用set theory将多个记录插入子表中。输出非常强大,习惯使用它会付出代价。
目前,scope_identity()中存在一个错误(请参阅链接:http://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value)Microsoft不打算修复。这应该会告诉你是否应该使用输出进行新的开发,即使它对于单个记录来说有点笨拙。
答案 1 :(得分:6)
不,这是不可能的。 OUTPUT子句只能输出到表/表变量中,或者用于标识可组合DML的列(这没有帮助)。 SCOPE_IDENTITY()
一路迈克尔。