日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server 中关于 @@error 的一个小误区

發布時間:2025/3/20 数据库 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server 中关于 @@error 的一个小误区 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文:SQL Server 中關于 @@error 的一個小誤區

在SQL Server中,我常常會看到有些前輩這樣寫:

if(@@error<>0)ROLLBACK TRANSACTION T elseCOMMIT TRANSACTION T

一開始,我看見別人這么寫,我就想當然的以為它只是個計數器,每當檢測到一處錯誤時,@@error的值+1,不過就因為這個理所當然,所以杯具了...

實際上,它并不是一個計數器,它是一個動態的值,動態的標識最后一條SQL命令執行的結果,如果成功則為0,不成功則標識錯誤碼。所以,像上面這種寫法是不妥的,舉個例子,如下:

SET NOCOUNT ON; SET XACT_ABORT ON; --執行 Transact-SQL 語句產生運行時錯誤,則整個事務將終止并回滾BEGIN TRANSACTION TUPDATE Test SET a='已更新' WHERE a='未更新'RAISERROR ('不好意思,你沒有權限!',16,1)

SELECT GETDATE()if(@@error<>0)ROLLBACK TRANSACTION T elseCOMMIT TRANSACTION T

分析:

  按我以前的理解來說,【?RAISERROR ('不好意思,你沒有權限!',16,1)?】這里拋出了一個錯誤,整個事務應該回滾才對,可是,它卻沒有回滾!!那么原因出在哪呢?原來,問題出在"SELECT GETDATE()"這句上面!因為執行RAISERROR語句時,@@error的值不為0(好像是5000),而當執行到下一句"SELECT GETDATE()"時,@@error的值又變為0了!所以,后面的if語句自然沒有捕捉到任何錯誤...

?

對策:

  既然找到了原因,那解決辦法自然也少不了。用Try...CATCH語法就可以了,語句如下:

SET NOCOUNT ON; SET XACT_ABORT ON; --執行 Transact-SQL 語句產生運行時錯誤,則整個事務將終止并回滾BEGIN TRYBEGIN TRANSACTION TUPDATE TestSET a='已更新'WHERE a='未更新'RAISERROR ('不好意思,你沒有權限!',16,1)SELECT GETDATE()COMMIT TRANSACTION T END TRY BEGIN CATCHDECLARE @msg nvarchar(2000)=ERROR_MESSAGE() --將捕捉到的錯誤信息存在變量@msg中 RAISERROR (@msg,16,1) --此處才能拋出(好像是這樣子....)ROLLBACK TRANSACTION T  --出錯回滾事務 END CATCH

?

?

總結

以上是生活随笔為你收集整理的SQL Server 中关于 @@error 的一个小误区的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。