微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

tsql – 在INSERT之后使用OUTPUT将identity列的值赋值为(非表值)变量

给出以下简单测试表:
CREATE TABLE dbo.Test
(
  Id bigint IDENTITY(1,1) NOT NULL,Name varchar(50) NULL
)

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

DECLARE @InsertedId BIGINT;

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

-- display resulting id for debugging
SELECT @InsertedId;
-- ...

我知道我可以在INSERT之后使用ScopE_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')
)

解决方法

记住输出子句的值是它可以返回多个记录和多个字段.因此,您可以输出一组数据的自然键和标识,因此您还可以使用集合理论将多个记录插入到子表中.输出非常强大,它将付出代价来习惯使用它.

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

原文地址:https://www.jb51.cc/mssql/75735.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐