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