SQL Server 中關於 @@error 的一個小誤區

來源:互聯網
上載者:User

標籤:

原文:SQL Server 中關於 @@error 的一個小誤區

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

if(@@error<>0)    ROLLBACK TRANSACTION Telse    COMMIT TRANSACTION T

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

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

SET NOCOUNT ON;SET XACT_ABORT ON;  --執行 Transact-SQL 陳述式產生執行階段錯誤,則整個事務將終止並復原BEGIN TRANSACTION TUPDATE TestSET a=‘已更新‘WHERE a=‘未更新‘RAISERROR (‘不好意思,你沒有許可權!‘,16,1)

SELECT GETDATE()if(@@error<>0) ROLLBACK TRANSACTION Telse COMMIT 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 TRY    BEGIN TRANSACTION T    UPDATE Test    SET a=‘已更新‘    WHERE a=‘未更新‘    RAISERROR (‘不好意思,你沒有許可權!‘,16,1)    SELECT GETDATE()        COMMIT TRANSACTION TEND TRYBEGIN CATCH    DECLARE @msg nvarchar(2000)=ERROR_MESSAGE()    --將捕捉到的錯誤資訊存在變數@msg中                   RAISERROR (@msg,16,1)    --此處才能拋出(好像是這樣子....)    ROLLBACK TRANSACTION T  --出錯回滾事務END CATCH

 

 

SQL Server 中關於 @@error 的一個小誤區

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.