2011-12-08 28 views
0

我已經在這個形式的存儲過程:爲什麼這個SQL解析器執行這個非法語法?

ALTER PROCEDURE [dbo].[fooBar] 
(
) 
AS 
BEGIN 
-- etc 
RETURN @Success 
END 

它已經完全在它BEGINEND前工作,但改變的東西,恢復回來後,就拒絕執行,指着一個語法錯誤在最後的END(刪除下一個指向過程中第一個IF/BEGIN/....語句的語法錯誤,從而開始你的瘋狂追逐)。

查看MSDN official documentation的語法,BEGINEND用於這種方式來封裝存儲過程是非法的。 (刪除BEGINEND解決了這個問題)

問題:爲什麼會發生這種情況?

編譯器跳過這個BEGINEND最初是否會發現它?有一些SQL編譯器忽略的東西嗎?是遺產嗎?它只是挑剔嗎?我是否缺少修補程序?

這是SQL Server 10.50.1617

+3

BEGIN和END對劃分過程不是非法的:一個或多個Transact-SQL語句組成過程的主體。您可以使用可選的BEGIN和END關鍵字來包含這些語句。它們是可選的,但不是非法的...... – Sparky

+0

'BEGIN'和'END'在許多語言中相當於'{'和'}'。如果你真的想,你可以在每一個單獨的陳述中放置BEGIN和END。 – MatBailie

+4

在所有可能的情況下,您還有其他不匹配的BEGIN/END元素,以至於只有當解析器到達文件末尾時纔會捕獲內部錯誤,然後才意識到出現了錯誤。在Java/C#中有一個太多的{大括號。 – jklemmack

回答

1

BEGIN/END是完全有效的存儲過程。這在鏈接到的文檔頁面的語法中明確設置。

這是不允許的圓括號。