给出以下简单的测试表:
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
子句而不诉诸表变量?
Update,另一种人为的尝试也是不合法的:
-- 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')
)
请记住,输出子句的价值在于它可以返回多个记录和多个字段。因此,您可以输出一组数据的自然键和标识,这样您还可以使用集合论将多条记录插入到子表中。输出非常强大,习惯使用它是值得的。
目前scope_identity() 中存在一个错误(请参阅链接:http://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-in Correct-value http://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value)微软不打算修复。这应该会给你一个线索,告诉你是否应该使用输出进行新的开发,即使它对于单个记录来说有点笨拙。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)