我很確定發生了什麼,但想從我的同事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#中。
想法?意見?謝謝!
這不是一個討論網站。這是一個問答網站。請參閱http://stackoverflow.com/faq#dontask – 2012-02-28 21:14:17
如果您從http://blog.stackoverflow.com/2011/07/its的角度重新編寫此問題,此問題可能會「更好地保留」 -ok-to-ask-and-answer-your-own-questions/ – sarnold 2012-02-29 01:29:39