我在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子句中使用局部变量?
答案 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);
阿尔贝托