2012-02-28 103 views
-2

我很確定發生了什麼,但想從我的同事SQL Server Travelers中得到一些想法(實際上很明顯發生了什麼,但我認爲這是一個有趣的討論)。缺少BEGIN和END?

謎語我這個蝙蝠俠...這是怎麼回事?

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
PRINT 'Drop me!'; 
END 
DROP PROCEDURE ToBeDropped; 

會發生什麼?我的第一個想法是程序被創建,然後立即下降。 Wrongo!你可能也想過,除非你已經知道這件事從以前的事情承認它!

在SSMS中按Ctrl-T將查詢結果切換爲文本。然後運行下面(或者你可以腳本的新程序ToBeDropped):

SELECT m.[definition] 
FROM sys.sql_modules AS m INNER JOIN sys.objects AS obj 
ON m.object_id = obj.object_id 
WHERE obj.name = 'ToBeDropped'; 

下運行的程序:

EXECUTE ToBeDropped; 

的重演上述sys.sql_modules查詢或試圖腳本的對象。你不能,因爲它不再存在。

嗯......這是怎麼回事?很明顯,有一個隱含的開始和結束的,而過程中,類似以下內容:

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
BEGIN 
PRINT 'Drop me!'; 
END 
DROP PROCEDURE ToBeDropped; 
END; 

進行格式化的更好的長相時,像下面這樣:

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
    BEGIN 
     PRINT 'Drop me!'; 
    END 

    DROP PROCEDURE ToBeDropped; 
END ; 

我不是隱行爲的忠實粉絲。我更喜歡明確。 TSQL正在朝着變得更加「真實」的方向發展 - 請參閱分號和現有的所有CLR功能,或者可能在TSQL中提供的所有CLR功能。我希望看到一個CREATE PROCEDURE主體必須至少有一個BEGIN和END對 - heck make {是BEGIN的別名/同義詞,} END的別名/同義詞 - 並且我們會更接近TSQL轉向到C#中。

想法?意見?謝謝!

+0

這不是一個討論網站。這是一個問答網站。請參閱http://stackoverflow.com/faq#dontask – 2012-02-28 21:14:17

+0

如果您從http://blog.stackoverflow.com/2011/07/its的角度重新編寫此問題,此問題可能會「更好地保留」 -ok-to-ask-and-answer-your-own-questions/ – sarnold 2012-02-29 01:29:39

回答

2

下降的過程是PROC的一部分和proc不會掉下來,直到調用PROC

這將創建和刪除PROC,注意GO這是批處理終止,如果你不有drop語句將是PROC本身的一部分

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
PRINT 'Drop me!'; 
END 
GO 
DROP PROCEDURE ToBeDropped; 

,當你做到這一點

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
PRINT 'Drop me!'; 
END 
DROP PROCEDURE ToBeDropped; 

的PROC被創建,但沒有得到降PED直到調用PROC

EXEC ToBeDropped 

這有沒有關係開始,但因爲DROP PROC是程序本身的一部分,並沒有得到執行,直到你把它

當您嘗試xeecute在PROC再次

EXEC ToBeDropped 

您會收到以下消息

Msg 2812, Level 16, State 62, Line 1 
Could not find stored procedure 'ToBeDropped'. 
0

這是一個相當開放的問題,很可能會因模糊而關閉。也許你可以重新問一下Meta Overflow?

但是,在它關閉之前,我所知道的推理並不是因爲BEGIN和END。這是因爲GO。創建過程將所有邏輯放在它下面,直到它到達文件或GO的末尾。所以,這是你正在尋找的明確的價值:

CREATE PROCEDURE ToBeDropped 
AS 
BEGIN 
    PRINT 'Drop me!'; 
END 
--Completes the procedure creation 
GO 
DROP PROCEDURE ToBeDropped; 
+0

這個問題將會在Meta的降級會議上結束。元是關於網絡的問題,錯誤報告,建議,用戶支持。 – sarnold 2012-02-29 01:29:15

相關問題