在SQL Server中,我常常會(huì)看到有些前輩這樣寫:
if
(
@@error
<>
0
)
ROLLBACK
TRANSACTION
T
else
COMMIT
TRANSACTION
T
一開始,我看見別人這么寫,我就想當(dāng)然的以為它只是個(gè)計(jì)數(shù)器,每當(dāng)檢測(cè)到一處錯(cuò)誤時(shí),@@error的值+1,不過就因?yàn)檫@個(gè)理所當(dāng)然,所以杯具了...
實(shí)際上,它并不是一個(gè)計(jì)數(shù)器,它是一個(gè)動(dòng)態(tài)的值,動(dòng)態(tài)的標(biāo)識(shí)最后一條SQL命令執(zhí)行的結(jié)果,如果成功則為0,不成功則標(biāo)識(shí)錯(cuò)誤碼。所以,像上面這種寫法是不妥的,舉個(gè)例子,如下:
SET
NOCOUNT
ON
;
SET
XACT_ABORT
ON
;
--
執(zhí)行 Transact-SQL 語句產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,則整個(gè)事務(wù)將終止并回滾
BEGIN
TRANSACTION
T
UPDATE
Test
SET
a
=
'
已更新
'
WHERE
a
=
'
未更新
'
RAISERROR
(
'
不好意思,你沒有權(quán)限!
'
,
16
,
1
)
SELECT
GETDATE
()
if
(
@@error
<>
0
)
ROLLBACK
TRANSACTION
T
else
COMMIT
TRANSACTION
T
分析:
按我以前的理解來說,【?RAISERROR ('不好意思,你沒有權(quán)限!',16,1)?】這里拋出了一個(gè)錯(cuò)誤,整個(gè)事務(wù)應(yīng)該回滾才對(duì),可是,它卻沒有回滾??!那么原因出在哪呢?原來,問題出在"SELECT GETDATE()"這句上面!因?yàn)閳?zhí)行 RAISERROR 語句時(shí),@@error的值不為0(好像是5000),而當(dāng)執(zhí)行到下一句"SELECT GETDATE()"時(shí),@@error的值又變?yōu)?了!所以,后面的if語句自然沒有捕捉到任何錯(cuò)誤...
?
對(duì)策:
既然找到了原因,那解決辦法自然也少不了。用Try...CATCH語法就可以了,語句如下:
SET
NOCOUNT
ON
;
SET
XACT_ABORT
ON
;
--
執(zhí)行 Transact-SQL 語句產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,則整個(gè)事務(wù)將終止并回滾
BEGIN
TRY
BEGIN
TRANSACTION
T
UPDATE
Test
SET
a
=
'
已更新
'
WHERE
a
=
'
未更新
'
RAISERROR
(
'
不好意思,你沒有權(quán)限!
'
,
16
,
1
)
SELECT
GETDATE
()
COMMIT
TRANSACTION
T
END
TRY
BEGIN
CATCH
DECLARE
@msg
nvarchar
(
2000
)
=
ERROR_MESSAGE()
--
將捕捉到的錯(cuò)誤信息存在變量@msg中
RAISERROR
(
@msg
,
16
,
1
)
--
此處才能拋出(好像是這樣子....)
ROLLBACK
TRANSACTION
T
--
出錯(cuò)回滾事務(wù)
END
CATCH
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

