SQL Server输出子句转换为标量变量


134

是否有任何“简单”的方法可以执行此操作,或者我需要使用“ OUTPUT ... INTO”语法传递表变量?

DECLARE @someInt int

INSERT INTO MyTable2(AIntColumn)
OUTPUT @SomeInt = Inserted.AIntColumn
VALUES(12)

Answers:


161

您需要一个表变量,它可以很简单。

declare @ID table (ID int)

insert into MyTable2(ID)
output inserted.ID into @ID
values (1)

45
但是然后,我不得不“选择@someInt = ID来自@ID”。我想知道是否可以跳过该多余的步骤(以及中间表变量)(如果我需要的只是结果int)。
Benoittr 2011年

@Benoittr-这取决于您将如何使用该值,可能没有必要,您可以在select语句的from子句中使用该表。在分配变量时,还需要确保插入内容仅插入了一行。并且,如果插入仅插入一行,那么也许更容易直接掌握values子句中使用的内容而不是使用output
Mikael Eriksson

4
对于自动生成的值,并非总是可能提前知道值(标识,计算列)。我了解有许多解决方法。不过,您还是给了我我想要的答案。谢谢
Benoittr 2011年

需要一个常规变量吗? DECLARE @InsertedIDResults TABLE (ID int); INSERT INTO MyTable (Name, Age) OUTPUT INSERTED.ID INTO @InsertedIDResults VALUES('My Name', 30); DECLARE @InsertedID int = (SELECT TOP 1 ID FROM @InsertedIDResults);
Arvo Bowen

30

一年多以后...如果您需要获取表的自动生成的ID,则只需

SELECT @ReportOptionId = SCOPE_IDENTITY()

否则,您似乎无法使用表格。


6
我一直在寻找的变量确实是identity列以外的其他变量。不过,感谢您的回答。
贝努特(Benoittr)2012年

26
显然,这在多处理器并行计划中存在问题,并且OUTPUT是唯一始终可信赖的方法。
andrewb 2014年

6
即使最后一个 INSERT没有插入任何内容,SCOPE_IDENTITY()也会返回一些内容,对吗?在某些情况下,这将使其无法使用。
Patrick Honorez

2
更好地使用输出子句
Clay Smith

1
@andrewb引用的错误已在2008 R2 SP1中修复。
adam0101

6

后来,但仍然值得一提的是,您还可以使用变量在UPDATE的SET子句或SELECT的字段中输出值。

DECLARE @val1 int;
DECLARE @val2 int;
UPDATE [dbo].[PortalCounters_TEST]
SET @val1 = NextNum, @val2 = NextNum = NextNum + 1
WHERE [Condition] = 'unique value'
SELECT @val1, @val2

在上面的示例中,虽然我怀疑来自触发器的任何更改都不会在val2中进行,但@ val1具有before值,而@ val2具有after值,因此在这种情况下,您必须使用输出表。除了最简单的情况外,我认为输出表也将在您的代码中更具可读性。

一个非常有用的地方是,如果您想将一列变成逗号分隔的列表;

DECLARE @list varchar(max) = '';
DECLARE @comma varchar(2) = '';
SELECT @list = @list + @comma + County, @comma = ', ' FROM County
print @list

谢谢!这是我需要的信息
Wizou

1
哇!我不知道你能做SET @val2 = NextNum = NextNum + 1
山姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.