一尘不染

来自局部变量的MAXRECURSION值

sql

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

foo递归地调用自身,但是当SP的参数之一(@bar)为null时无限循环。

为了停止这个无限循环,我一直在尝试使用该选项MAXRECURSION

  • @bar为null时,将MAXRECURSION设置为1;
  • @bar不为null时,将MAXRECURSION设置为0(无限制)。

因此,我声明了一个局部变量@maxrec,该变量取1或0,具体取决于是否@bar为null。

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'.,它指向line OPTION (MAXRECURSION@localvar)

那我在做什么错?是否禁止在OPTION子句中使用局部变量?


阅读 231

收藏
2021-03-08

共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语句完成之前已达到该值,则查询将无法正常结束,它将引发异常。那可能就是您想要的,但是要意识到这一点。

2021-03-08