2010-12-10 32 views
0

我想分離一個問題(類似於stackoverflow.com/q/483787/537284中的主題)。這個問題涉及存儲過程,並且每週「隨機」發生一次。爲了嘗試重現問題,我創建了不同的過程版本以模擬好的和可能的結果:在重新編譯時存儲過程語法錯誤被捕獲並返回空結果集

  • 良好的多行單結果集。
  • 良好的多行單結果集與信息性消息。
  • 良好的多行單結果集與Raiserror(小於11級)。
  • 良好的多行單結果集與打印。
  • 好空單結果集。
  • 錯誤的語法錯誤。
  • try/catch語法錯誤。
  • Raiserror錯誤(級別11)。
  • Raiserror(級別11)和try/catch錯誤。

在這些測試之間,try/catch版本的語法錯誤的行爲與我所期望的不同。兩個結果集(一個空的,另一個來自catch指令)返回。

語法錯誤得到部分執行嗎?我期待catch塊的結果,而不是嘗試。我將它與一個Raiserror進行了比較,並使用嚴重性11,它會觸發catch塊,只返回一個結果集。語法錯誤和Raiserror有什麼區別?

這裏是我的測試程序:

AS 
BEGIN 
    SET NOCOUNT ON 
    SET ANSI_WARNINGS ON  
    SET IMPLICIT_TRANSACTIONS OFF 
    SET XACT_ABORT OFF 
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

BEGIN TRY 
    --RAISERROR ('goes to message tab yes?', 11, 1) WITH NOWAIT 
    SELECT '1' [myfield] FROM test_fulltext (nolock) WHERE CONTAINS(Command,'a monkey') 
    RETURN 0 
END TRY 
BEGIN CATCH 
    SELECT ERROR_NUMBER() [ErrorNumber] 
END CATCH 
RETURN -9999 
END 

這裏是我的測試表(從別人撕開):

CREATE TABLE test_fulltext 
( 
    SPID INT NOT NULL, 
    Status VARCHAR(32) NULL, 
    Login SYSNAME NULL, 
    HostName SYSNAME NULL, 
    BlkBy SYSNAME NULL, 
    DBName SYSNAME NULL, 
    Command VARCHAR(32) NULL, 
    CPUTime INT NULL, 
    DiskIO INT NULL, 
    LastBatch VARCHAR(14) NULL, 
    ProgramName VARCHAR(32) NULL, 
    SPID2 INT 
) 
CREATE UNIQUE INDEX fulltextui ON test_fulltext(SPID); 
CREATE FULLTEXT CATALOG fulltextft AS DEFAULT; 
CREATE FULLTEXT INDEX ON test_fulltext(Command) KEY INDEX fulltextui; 

回答

0

請務必仔細閱讀說明部分上TRY...CATCH in Books Online。它在痛苦的細節中解釋了這種行爲。

我不明白的是關於「強制語法錯誤」的整個業務......如果它存在於存儲過程中,並且其中存在語法錯誤,則甚至不會創建SP。難道你真的在執行存儲過程的舊版本嗎?

+0

感謝您的文章。這非常有幫助。它回答了有關Raiserror和語法錯誤之間差異的問題。我相信存儲過程編譯和創建,因爲語法錯誤是在創建時必須通過的模式匹配字符串中。我會嘗試並在那裏發佈我的問題。有關於重新編譯和延遲名稱解析的解釋似乎最接近,但它仍表示錯誤不會被catch捕獲並返回到原始執行級別。我目睹的是在語法錯誤之後執行的catch。 – patterns 2010-12-10 19:41:55