运行 SQL 2005 X64。
首先,在数据库上创建以下存储过程:
CREATE PROCEDURE dbo.Test
@Value int = null
AS
BEGIN
IF (IsNull(@Value, '') = '')
SELECT '*I am NULL!*'
ELSE
SELECT 'I am ' + CONVERT(varchar(20), @Value)
END
尝试按如下方式执行上面的过程,你会得到如下结果:
EXEC dbo.Test
我是 NULL!
现在,更改 proc,使 EXEC 语句成为 sproc 本身的一部分:
ALTER PROCEDURE dbo.Test
@Value int = null
AS
BEGIN
IF (IsNull(@Value, '') = '')
SELECT 'I am NULL!'
ELSE
SELECT 'I am ' + CONVERT(varchar(20), @Value)
END
EXEC dbo.Test
如果你现在执行它,你会得到...
我是 NULL!
我是 NULL!
我是 NULL!
...无限直到输出因以下错误而中断:
Msg 217, Level 16, State 1, Procedure Test, Line 16 Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
暂时忽略这根本不是标准做法,而且很可能有人只是偶然地做这样的事情,有人可以提供一些关于 SQL 2005 在“思考”什么的低级见解此过程的第二个化身已执行?
最佳答案
您的代码表现符合预期。该过程正在调用自身 recursively .
如果您不想要那个,试试这个:
ALTER PROCEDURE dbo.Test
@Value int = null
AS
BEGIN
IF (IsNull(@Value, '') = '')
SELECT 'I am NULL!'
ELSE
SELECT 'I am ' + CONVERT(varchar(20), @Value)
END
GO
EXEC dbo.Test
如果你确实想使用递归,你必须定义一个base case (也称为“退出条件”),这将使存储过程退出递归堆栈。
https://stackoverflow.com/questions/6615327/