運行SQL 2005 X64。是什麼導致了這種奇怪的SQL行爲?
首先,在數據庫中創建以下存儲過程:
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
我NULL!
現在,改變PROC,以便EXEC語句是存儲過程本身的一部分:
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是「思考」,當這個過程的第二個化身被執行?
要理解遞歸,首先必須瞭解遞歸。 – Joe
沒有什麼神祕的。它將處理所有內容,直到批處理結束時的下一個GO或其他指示符作爲proc的一部分。作爲過程的一部分,最外面的BEGIN和END不是必需的語法。 – Joe
請注意文檔http://msdn.microsoft.com/en-us/library/ms189762(v=sql.90).aspx – Joe