0

我正在尝试编写一个递增并返回 int 列值的函数:

CREATE PROCEDURE [GetNextTagSuffix]
AS
BEGIN

    UPDATE [MyTable]
    SET [NextTagSuffix] = [NextTagSuffix] + 1
    OUTPUT DELETED.[NextTagSuffix]
    WHERE [MyTableId] = 'SpecialCase'

END

OUTPUT子句可以输出INTO表变量或临时表,但我只需要该单个值,因此首先将其添加到表变量中似乎很愚蠢。有没有办法将该值直接分配给变量并返回它?

使用表变量解决:

CREATE PROCEDURE [GetNextTagSuffix]
@TagSuffix int out
AS
BEGIN

DECLARE @tagTable TABLE
(
  NextTagSuffix int
)

UPDATE [MyTable]
SET [NextTagSuffix] = [NextTagSuffix] + 1
OUTPUT DELETED.[NextTagSuffix] INTO @tagTable
WHERE [MyTableId] = 'SpecialCase'

SET @TagSuffix = (SELECT MAX(NextTagSuffix) FROM @tagTable)

RETURN @TagSuffix

END
4

2 回答 2

2

我相信您必须将输出分配给表变量或临时表。从BOL 文档中,

<OUTPUT_CLAUSE> ::=
{
    [ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ ( column_list ) ] ]
    [ OUTPUT <dml_select_list> ]
}

请注意它如何指定可以将输出选择到表变量或表中。

2006 年,提交了一个Microsoft Connect 操作项,要求准确地请求您想要使用的功能(从 OUTPUT 子句的结果对标量变量进行赋值的能力)。Microsoft 将该项目关闭为“Closed as Won't Fix”,因此可以肯定此功能在 SQL 2005 中不可用,也没有放入 SQL 2008。因此,除非他们改变主意,否则它在 SQL 2012 中也不可用. 您可能希望在未来的 SQL 版本中对连接项目进行投票或提交一个新的请求此功能的项目。

于 2012-05-29T01:27:38.087 回答
0

但是你可以在你的 SP 中使用输出参数

CREATE PROCEDURE [GetNextTagSuffix]
@value int output
AS
BEGIN

UPDATE [MyTable]
SET [NextTagSuffix] = [NextTagSuffix] + 1
OUTPUT DELETED.[NextTagSuffix]
WHERE [MyTableId] = 'SpecialCase'

END


DECLARE @result int 
EXEC GetNextTagSuffix @value=@result output
于 2012-05-29T01:34:37.253 回答