2012-03-26 56 views
0

下午好一切 -SQL創建過程中止邏輯

我需要在幾個地方運行的修補程序臨時存儲過程,我想中止SP如果版本的創建和編譯的應用程序不完全是我輸入的。我有基本的想法,但我希望消息在沒有嘗試編譯SP的所有架構問題的情況下出來。

這裏基本上是我有:

IF EXISTS ... DROP PROCEDURE 

SELECT TOP 1 Version INTO #CurrentVersion FROM Application_Version ORDER BY UpdateDate DESC 

IF NOT EXISTS (SELECT 1 FROM #CurrentVersion WHERE Version = 10) 
RAISERROR ('This is for U10 only. Check the application version.', 20, 1) WITH LOG 

CREATE PROCEDURE .... 

的RAISERROR使SP在DB不會落得和我得到一個錯誤,但我也有由於架構更改架構錯誤結束過去。由於SP需要成爲批處理中的第一條語句,我不能使用IF/ELSE,NOEXEC會產生與RAISERROR相同的結果(沒有錯誤)。

對於如果沒有SP檢查模式,如果它碰到RAISERROR,所以我不會收到一堆額外的消息,從而得到上述所有相同結果的任何想法?

回答

0

RETURN語句將退出SP。在進行錯誤檢查時,在您的IF聲明和RAISERROR聲明後輸入BEGINEND

1

你想要的是錯誤狀態停止腳本,它可以在SQLCMD mode of the query editor與執行一個簡單的:on error exit

:on error exit 

SELECT TOP 1 Version INTO #CurrentVersion FROM Application_Version ORDER BY UpdateDate DESC 

IF NOT EXISTS (SELECT 1 FROM #CurrentVersion WHERE Version = 10) 
    RAISERROR ('This is for U10 only. Check the application version.', 16, 1); 
go 

IF EXISTS ... DROP PROCEDURE 
go 

CREATE PROCEDURE .... 
... 
go 

有了這個地方有沒有必要提高嚴重性20嚴重性16就足夠了,這會照顧你抱怨的ERRORLOG問題。

0

這裏有幾個選項。我的做法如下,因爲我覺得它提供了最好的流程:

IF EXISTS ... DROP PROCEDURE 

IF EXISTS (SELECT * FROM Application_Version WHERE Version = 10) 
BEGIN 
    DECLARE @sql NVARCHAR(MAX) 
    SET @sql = 'CREATE PROCEDURE blablabla AS 
     BEGIN 
      -- Your Procedure HERE 
     END' 
    EXEC sp_executesql @sql 
END ELSE 
    RAISERROR ('This is for U10 only. Check the application version.', 20, 1) WITH LOG 
+0

謝謝,這實際上與我期望做的最合適。 SQLCMD可以完美工作,但我希望能夠防範那些明顯沒有足夠關注SP的文檔和命名的人,並且錯過版本註釋的人可能看不到另一個註釋切換到SQLCMD模式。感謝大家的幫助! – user1293946 2012-03-27 15:09:01