1. 程式人生 > >(5)DML增強功能-try catch及事務控制

(5)DML增強功能-try catch及事務控制

code sys 之間 server recommend sel 因此 視圖 數據庫連接

一、事務控制與Try Catch結合

BEGIN TRY
  BEGIN TRAN;
    DECLARE @aaa NVARCHAR(MAX);
    SET @aaa = 9 / 0;
  COMMIT TRAN;
END TRY
BEGIN CATCH
--【錯誤】--
  DECLARE
  @ErrorMessage NVARCHAR(MAX)
  , @ErrorSeverity INT
  , @ErrorState INT
  , @exception NVARCHAR(255);
  SELECT
  @ErrorMessage = ERROR_MESSAGE()
  , 
@ErrorSeverity = ERROR_SEVERITY()   , @ErrorState = ERROR_STATE();   PRINT 【!ERROR!】;   SET @exception   = (State + CAST(@ErrorState AS NVARCHAR(20)) + , Severity + CAST(@ErrorSeverity AS NVARCHAR(20)) + )   + @ErrorMessage;   PRINT @exception;   ROLLBACK;   PRINT 回滾成功 END CATCH;

try catch註意事項:

  技術分享圖片

try catch 常用錯誤函數處理;

  技術分享圖片

二、錯誤處理函數:

其他:

(1)@@ERROR :當前一個語句遇到錯誤,則返回錯誤號,否則返回0。需要註意的是@ERROR在每一條語句執行後會被立刻重置,因此應該在要驗證的語句執行後檢查數值或者是將它保存到局部變量中以備將來使用。

(2)@@ROWCOUNT:返回當前一個語句影響的行數,需要註意的是它在每一條語句執行後會被立刻重置(包含其本身),因此應該在要驗證的語句執行後檢查數值或者是將它保存到局部變量中以備將來使用。

(3)@@TRANCOUNT:當前事務數量

三、自定義錯誤(拋出異常)

本部分轉自:https://www.cnblogs.com/weixing/p/3930162.html

BEGIN TRY
  RAISERROR (Error raised in TRY block., -- Message text.
  16, -- Severity.
  1 -- State.
);
END TRY
BEGIN CATCH
  DECLARE @ErrorMessage NVARCHAR(4000);
  DECLARE @ErrorSeverity INT;
  DECLARE @ErrorState INT;

SELECT 
  @ErrorMessage = ERROR_MESSAGE(),
  @ErrorSeverity = ERROR_SEVERITY(),
  @ErrorState = ERROR_STATE();
  print @errorMessage
 RAISERROR (@ErrorMessage, -- Message text.
  @ErrorSeverity, -- Severity.
  @ErrorState -- State.
);
END CATCH;

演示如圖:

技術分享圖片

詳細說明如下:

raiserror 的作用: raiserror 是用於拋出一個錯誤。[ 以下資料來源於sql server 2005的幫助 ] 
其語法如下:

RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ]
)
[ WITH option [ ,...n ] ]

簡要說明一下:

第一個參數:{ msg_id | msg_str | @local_variable }
msg_id:表示可以是一個sys.messages表中定義的消息代號;
使用 sp_addmessage 存儲在 sys.messages 目錄視圖中的用戶定義錯誤消息號。
用戶定義錯誤消息的錯誤號應當大於 50000。

msg_str:表示也可以是一個用戶定義消息,該錯誤消息最長可以有 2047 個字符;
(如果是常量,請使用N‘xxxx‘,因為是nvarchar的)
當指定 msg_str 時,RAISERROR 將引發一個錯誤號為 5000 的錯誤消息。

@local_variable:表示也可以是按照 msg_str 方式的格式化字符串變量。

第二個參數:severity
用戶定義的與該消息關聯的嚴重級別。(這個很重要)
任何用戶都可以指定 0 到 18 之間的嚴重級別。
[0,10]的閉區間內,不會跳到catch;
如果是[11,19],則跳到catch;
如果[20,無窮),則直接終止數據庫連接;

第三個參數:state
如果在多個位置引發相同的用戶定義錯誤,
則針對每個位置使用唯一的狀態號有助於找到引發錯誤的代碼段。

介於 1 至 127 之間的任意整數。(state 默認值為1)
當state 值為 0 或大於 127 時會生成錯誤!

第四個參數:argument
用於代替 msg_str 或對應於 msg_id 的消息中的定義的變量的參數。

第五個參數:option
錯誤的自定義選項,可以是下表中的任一值:
LOG :在錯誤日誌和應用程序日誌中記錄錯誤;
NOWAIT:將消息立即發送給客戶端;
SETERROR:將 @@ERROR 值和 ERROR_NUMBER 值設置為 msg_id 或 50000;

(5)DML增強功能-try catch及事務控制