【发布时间】:2011-09-30 17:09:36
【问题描述】:
运行 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
尝试如下执行上面的proc,你会得到如下结果:
EXEC dbo.Test
我是空的!
现在,改变 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
如果你现在执行它,你会得到......
我是空的!
我是空的!
我是空的!
...ad infinitum 直到输出中断并出现此错误:
消息 217,级别 16,状态 1,程序 测试,第 16 行 最大存储量 过程、函数、触发器或视图 超出嵌套级别(限制 32)。
暂时忽略这根本不是标准做法,并且很可能有人会偶然做这样的事情,有人可以提供一些关于 SQL 2005 在这个过程的第二个化身被执行了吗?
【问题讨论】:
-
要了解递归,首先必须了解递归。
-
没什么神秘的。它将处理直到下一个 GO 或批次结束的其他指示符之前的所有内容作为 proc 的一部分。作为过程的一部分,最外面的 BEGIN 和 END 不是必需的语法。
-
注意文档msdn.microsoft.com/en-us/library/ms189762(v=sql.90).aspx中BEGIN和END周围的方括号
-
@Joe,这就是答案。你应该把那篇文章写成“完整”的帖子,而不仅仅是评论。
-
只是另一条评论,将 INT 与 '' 进行比较对我来说根本不直观。你为什么不直接说 IF @Value IS NULL?使用 IsNull 进行比较有什么意义?
标签: sql sql-server sql-server-2005 stored-procedures recursion