3

と呼ばれる CTE (Common Table Expression) を宣言する SQL Server 2005 でストアド プロシージャを作成していますfoo

foo自身を再帰的に呼び出しますが、SP のパラメーター ( @bar) の 1 つが null の場合は無限にループします。

この無限ループを止めるために、オプションを使用しようとしましたMAXRECURSION:

  • が null の場合@bar、MAXRECURSION を 1 に設定します。
  • が null でない場合@bar、MAXRECURSION を 0 (制限なし) に設定します。

そこで、 null@maxrecかどうかに応じて 1 または 0 を取るローカル変数を宣言しました。@bar

DECLARE @maxrec INT;
SET @maxrec = 0;
if (@dim_course_categories is null)
begin
    SET @maxrec = 1;
end

;WITH foo AS (
    ...
)

SELECT * FROM foo
OPTION (MAXRECURSION @maxrec)

Incorrect syntax near '@maxrec'.コードを解析すると、行を参照する次のエラーが表示 されますOPTION (MAXRECURSION @localvar)

それで、私は何を間違っていますか?OPTION句内でローカル変数を使用することは禁止されていますか?

4

2 に答える 2

3

1つのオプションは、クエリを作成してから、EXEC sp_executesql

DECLARE @Query NVARCHAR(MAX)

SET @Query = N'
    ;WITH foo AS (
        ...
    )

    SELECT * FROM foo
    OPTION (MAXRECURSION ' + CAST(@maxrec AS NVARCHAR) + ');'

EXEC sp_executesql @Query

MAXRECURSIONちなみに、ステートメントが完了する前に値に達した場合、クエリは正常に終了せず、例外がスローされます。それはあなたが望むものかもしれませんが、それだけに注意してください。

于 2012-07-11T02:28:40.507 に答える
1

別のオプションは、選択を変更することです

DECLARE @maxrec INT;
SET @maxrec = 0;
if (@dim_course_categories is null)
    SET @maxrec = 1;

;WITH foo AS (
    SELECT colonne
    UNION ALL
    SELECT colonne FROM foo
    WHERE @maxrec = 0
      AND (other_condition)
)

SELECT * FROM foo
OPTION (MAXRECURSION 0);

アルベルト

于 2013-01-23T10:59:41.537 に答える