来自局部变量的MAXRECURSION值

时间:2012-07-11 01:55:38

标签: sql sql-server tsql

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

foo以递归方式调用自身,但在SP的一个参数(@bar)为空时无限循环。

要停止此无限循环,我一直在尝试使用选项MAXRECURSION

  • @bar为null时,将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子句中使用局部变量?

2 个答案:

答案 0 :(得分:3)

一种选择是构建查询,然后使用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值,查询将不会正常结束,它将引发异常。这可能是你想要的,但要注意它。

答案 1 :(得分: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);

阿尔贝托