2010-03-15 73 views
1

我正在寫一個存儲過程,其中我使用try catch塊。有沒有可能在捕獲異常時手動引發系統異常?

現在我在表中有一個獨特的列。當我嘗試插入重複的值,它拋出,出現異常的異常沒有2627

我想這是這樣

來完成,如果(存在(SELECT * FROM tblABC其中COL1 =「值」)= TRUE) RAISEERROR(2627) - 提高將拋出,如果我會用插入查詢插入重複值系統錯誤

編輯:

我米使用事務它得到的處理異常因此導致遞增回滾@@身份值得到前在之前的查詢中發生了異常b4發生了異常。

我想檢查b4實際插入時可能發生的所有這種異常。爲了做到這一點,我會檢查異常,可能會使用帶有if else的select語句手動引發錯誤。在這裏,我將能夠趕上唯一鍵衝突,但不會發生的異常,所以我會故意在這裏拋出異常,但該異常,我想應該是一個系統異常即錯誤2627

和方法會更好,使用 插入查詢或檢查重複 值插入前使用選擇 查詢?

是有可能好歹能爲整個系統 EXCEPTION開捕EXCEPTION 手動即投擲SAME異常SQL會捻線

回答

2

不能提高系統錯誤。 RAISERROR(2627 ...)是非法的。除了你說謊的事實(沒有發生錯誤2627),你錯過了插入消息格式。

應用程序不應該依賴IDENTITY的連續性,因爲你抱怨說'增加自動增量'會讓你的應用程序狂歡,所以有一個錯誤(當然,如果不是代碼的話,在設計中就是這樣)。 IDENTITY值可能包含差距,是其規範的一部分。

至於什麼更好,插入和捕捉,或嘗試更新:這取決於你的流行模式。如果該值可能存在,則UPDATE第一個策略更好。如果該值可能不存在或概率未知出於性能和更重要的原因,正確性(SELECT檢查在併發下永遠不會正確),最好INSERT並捕獲錯誤。

+0

@Remus Plz回答我的編輯。因爲沒有獲得關於我的問題的描述性信息 – 2010-03-15 21:30:42

+0

編輯完成後,我的帖子不需要更新。一切都站着。 – 2010-03-15 21:38:40

+0

T-SQL的TRY/CATCH中沒有重新拋出語義。你必須拋出一個*新的*自定義類型的異常(即50000以上的錯誤代碼)。這很麻煩,但這是T-SQL異常處理的最新技術。 – 2010-03-15 21:47:37