从局部变量MAXRECURSION值(MAXRECURSION value from local v

2019-09-19 07:18发布

我正在写在SQL Server 2005的存储过程声明了一个名为CTE(公共表表达式) foo

foo递归调用自己,却又无限循环,当SP的参数(之一@bar )为空。

为了制止这种无限循环,我一直在试图使用选项MAXRECURSION

  • @bar为空,设置MAXRECURSION为1;
  • @bar不为空,设置MAXRECURSION为0(没有限制)。

所以我声明的局部变量@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子句中使用局部变量?

Answer 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语句完成之前达到的值,查询将无法正常结束,它会抛出异常。 这可能是你想要的,但只是意识到这一点。



Answer 2:

另一种选择是改变你的选择

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);

阿尔贝托



文章来源: MAXRECURSION value from local variable