我正在SQL Server 2005中编写一个存储过程,该存储过程声明了一个名为的CTE(公用表表达式)foo。
foo
foo递归地调用自身,但是当SP的参数之一(@bar)为null时无限循环。
@bar
为了停止这个无限循环,我一直在尝试使用该选项MAXRECURSION:
MAXRECURSION
因此,我声明了一个局部变量@maxrec,该变量取1或0,具体取决于是否@bar为null。
@maxrec
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)。
Incorrect syntax near '@maxrec'.
OPTION (MAXRECURSION@localvar)
那我在做什么错?是否禁止在OPTION子句中使用局部变量?
一种选择是建立查询,然后执行 EXEC sp_executesql
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语句完成之前已达到该值,则查询将无法正常结束,它将引发异常。那可能就是您想要的,但是要意识到这一点。