sql - 是什么导致了这种奇怪的 SQL 行为?

运行 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/

相关文章:

objective-c - [pool release] 和 [pool drain] 有什么区别?

ruby-on-rails - ruby rails : How can I add a css f

f# - 将字典键添加到 F# 中的构造函数

django - 将 Django 模型/表拆分为两个模型/表是否有性能优势?

ruby-on-rails-3 - Rails 3 在不注销的情况下设计更新密码

function - 为什么 Matlab 看不到我的函数?

bash - .bashrc 在云端?

java - 从代数表达式创建二叉树

amazon-ec2 - 使用pscp自动接受rsa指纹

perl - reverse 不在列表上下文中隐式使用 $_,这是一个错误吗?