2009-08-06 45 views
4

(SQL 2005) raiserror是否可能終止存儲過程。使用RAISERROR的SQL語句終止

例如,在一個大型系統中,我們得到的值不是預期輸入到特定列中的值。在更新觸發,如果你寫:

如果存在(SELECT * FROM插入其中testcol = 7) 開始 RAISEERROR( '我的自定義錯誤',16,1) 端

更新信息仍應用。然而 如果運行

如果存在(SELECT * FROM插入其中testcol = 7) 開始 選擇1/0 端

由0錯誤除法拋出實際終止更新。 有沒有什麼辦法可以做到這一點與raiseerror所以我可以得到自定義錯誤信息回來?

回答

6

在觸發器中,發出ROLLBACK,RAISERROR,然後返回。

看到Error Handling in SQL Server - Trigger Context by Erland Sommarskog

+0

也是這個鏈接http://support.microsoft.com/kb/45581 – pjp 2009-08-06 14:57:08

+0

這是唯一有效的交易?或者是觸發器交易? – Bob 2009-08-06 14:58:36

+0

從我發佈的鏈接'在觸發器內時,不需要具有匹配的BEGIN TRANSACTION語句,因爲不在顯式事務中的每個SQL語句實際上都是單語句事務。' – pjp 2009-08-06 15:00:06

0

在執行更新之前,您應該檢查有效數據。

IF (@testvalue = 7) 
    RAISERROR("Invalid value.", 16, 1); 
ELSE 
    UPDATE... 
+0

什麼如果檢查和更新之間的數據的變化? – 2009-08-06 14:45:51

+0

本例中的數據是一個輸入參數,除非sproc明確更改它,否則不應更改。 – pjp 2009-08-06 14:53:41

+0

我不知道哪個sproc正在更新它,或者如果它是夜間數據庫作業,所以在更新它之前我無法檢查該值。 – Bob 2009-08-06 14:57:40

1

你能不只是添加CHECK約束列,以防止它被插在首位?

ALTER TABLE YourTable ADD CONSTRAINT CK_No_Nasties 
    CHECK (testcol <> 7) 

另外,您可以在您的插入存儲過程啓動一個事務(如果有的話),如果發生錯誤回滾。這可以通過在SQL Server 2005中使用TRY,CATCH來實現,並避免必須使用觸發器。

1
Begin try 
@temp number 
@temp=1/0 
End try 
Begin catch 
@errormsg varchar(100) 
@errormsg=error_massage() 
Raiseerror(@errormsg,16,1) 
End catch 
+1

您可以在解決方案的說明中添加嗎? – Ren 2012-11-07 09:17:16