gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:21:26 26 4
gpt4 key购买 nike

运行 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 (也称为“退出条件”),这将使存储过程退出递归堆栈。

关于sql - 是什么导致了这种奇怪的 SQL 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6615327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com