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

标签 tsql sql-server-2008 sql-server-2008-r2

给出以下简单测试表:

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')
)

最佳答案

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

Microsoft目前不打算修复scope_identity()中的一个错误(请参阅链接:http://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value)。这应该为您提供一个线索,即您是否应该将输出用于新开发,即使对于单个记录来说有点笨拙。

关于tsql - 在INSERT之后使用OUTPUT将标识列的值转换为(非表值)变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6221278/

相关文章:

sql-server-2008 - 使用另一个存储过程中的参数调用存储过程的正确语法

sql-server - 在 SQL Server 中处理带空格的列名

sql - 计算sql中条目之间的时间

sql-server - 从 varchar 列中选择 max int

Mysql引用并选择进入

SQL 查询在任何表中查找重复行

用于计算样本的最大值、最小值和众数的 SQL 查询

javascript - 使用 TSQL 到 "minify"javascript 代码?

SQL - 选择具有多个类别的不同行

SQL 服务器 2008 : Insert variable into DML statements using Stored Procedure