SQLServer 输出子句转换为标量变量

有没有什么“简单”的方法来做到这一点,或者我需要传递一个表变量与“ OUTPUT... INTO”语法?

DECLARE @someInt int


INSERT INTO MyTable2(AIntColumn)
OUTPUT @SomeInt = Inserted.AIntColumn
VALUES(12)
134295 次浏览

你需要一个表变量,它可以这么简单。

declare @ID table (ID int)


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

一年后... ... 如果您需要的是获得一个表的自动生成 id,那么您只需

SELECT @ReportOptionId = SCOPE_IDENTITY()

否则,看起来你就只能使用桌子了。

稍后但仍然值得一提的是,您还可以使用变量来输出 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

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

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

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

回答我

可以使用 @@IDENTITY获取最后插入的 id。

DECLARE @someInt int
INSERT INTO MyTable2(AIntColumn)
VALUES(12)
SET @someInt = @@IDENTITY;

假设您的表有一个主键,您希望将其设置为所述变量。

示例模式

CREATE TABLE MyTable2(
[ID] [INT] IDENTITY(1,1),
[aIntColumn] [INT]
)
CREATE TABLE MyTable3(
[ID] [INT] IDENTITY(1,1),
[newInt] [INT],
[FK_int] [INT]
)

然后你可以在你的脚本的下一部分使用它,例如。

DECLARE @someInt INT;
INSERT INTO MyTable2(AIntColumn)
VALUES(12)
SET @someInt = @@IDENTITY;


--do something else
DECLARE @someInt2 INT;
INSERT INTO MyTable3(newInt, FK_int)
VALUES(101, @someInt)
SET @someInt2 = @@IDENTITY;


SELECT @someInt AS 'First Inserted ID ',  @someInt2 AS 'Second inserted ID';