3

我正在 SQL Server 2005 中编写一个存储过程,它声明了一个名为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 子句中使用局部变量?

4

2 回答 2

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

于 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 回答