0

int列の値をインクリメントして返す関数を作成しようとしています。

CREATE PROCEDURE [GetNextTagSuffix]
AS
BEGIN

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

END

OUTPUT句はテーブル変数または一時テーブルに出力できますが必要なのはその単一の値だけなので、最初にテーブル変数に追加するのはばかげているようです。その値を変数に直接割り当てて返す方法はありますか?

テーブル変数を使用して解決:

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年に、使用したい機能(OUTPUT句の結果からスカラー変数への割り当てを行う機能)を正確に要求するMicrosoftConnectアクションアイテムが提出されました。Microsoftはこのアイテムを「修正されないためクローズ」としてクローズしたため、この機能はSQL 2005では使用できず、SQL 2008には組み込まれていませんでした。したがって、心変わりがない限り、SQL2012でも使用できません。 。将来の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 に答える