0)ROLLBACKTRANSACTIONTelseCOMMITTRANSACTIONT一開(kāi)始,我看見(jiàn)別人這么寫(xiě),我就想當(dāng)然的以為它只是個(gè)計(jì)數(shù)器,每當(dāng)檢測(cè)到一處錯(cuò)誤時(shí),@@error的值+1,不過(guò)就因?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ò)誤碼。所以,像上面這種寫(xiě)法是不妥的," />

日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

SQL Server 中關(guān)于 @@error 的一個(gè)小誤區(qū)

系統(tǒng) 2118 0

在SQL Server中,我常常會(huì)看到有些前輩這樣寫(xiě):

      
        if
      
      (
      
        @@error
      
      
        <>
      
      
        0
      
      
        )

    
      
      
        ROLLBACK
      
      
        TRANSACTION
      
      
         T


      
      
        else
      
      
        COMMIT
      
      
        TRANSACTION
      
       T
    

一開(kāi)始,我看見(jiàn)別人這么寫(xiě),我就想當(dāng)然的以為它只是個(gè)計(jì)數(shù)器,每當(dāng)檢測(cè)到一處錯(cuò)誤時(shí),@@error的值+1,不過(guò)就因?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ò)誤碼。所以,像上面這種寫(xiě)法是不妥的,舉個(gè)例子,如下:

      
        SET
      
       NOCOUNT 
      
        ON
      
      
        ;


      
      
        SET
      
       XACT_ABORT 
      
        ON
      
      ;  
      
        --
      
      
        執(zhí)行 Transact-SQL 語(yǔ)句產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,則整個(gè)事務(wù)將終止并回滾
      
      
        BEGIN
      
      
        TRANSACTION
      
      
         T




      
      
        UPDATE
      
      
         Test


      
      
        SET
      
       a
      
        =
      
      
        '
      
      
        已更新
      
      
        '
      
      
        WHERE
      
       a
      
        =
      
      
        '
      
      
        未更新
      
      
        '
      
      
        RAISERROR
      
       (
      
        '
      
      
        不好意思,你沒(méi)有權(quán)限!
      
      
        '
      
      ,
      
        16
      
      ,
      
        1
      
      )
      

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

分析:

  按我以前的理解來(lái)說(shuō),【?RAISERROR ('不好意思,你沒(méi)有權(quán)限!',16,1)?】這里拋出了一個(gè)錯(cuò)誤,整個(gè)事務(wù)應(yīng)該回滾才對(duì),可是,它卻沒(méi)有回滾!!那么原因出在哪呢?原來(lái),問(wèn)題出在"SELECT GETDATE()"這句上面!因?yàn)閳?zhí)行 RAISERROR 語(yǔ)句時(shí),@@error的值不為0(好像是5000),而當(dāng)執(zhí)行到下一句"SELECT GETDATE()"時(shí),@@error的值又變?yōu)?了!所以,后面的if語(yǔ)句自然沒(méi)有捕捉到任何錯(cuò)誤...

?

對(duì)策:

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

      
        SET
      
       NOCOUNT 
      
        ON
      
      
        ;


      
      
        SET
      
       XACT_ABORT 
      
        ON
      
      ;  
      
        --
      
      
        執(zhí)行 Transact-SQL 語(yǔ)句產(chǎn)生運(yùn)行時(shí)錯(cuò)誤,則整個(gè)事務(wù)將終止并回滾
      
      
        BEGIN
      
      
         TRY

    
      
      
        BEGIN
      
      
        TRANSACTION
      
      
         T



    
      
      
        UPDATE
      
      
         Test

    
      
      
        SET
      
       a
      
        =
      
      
        '
      
      
        已更新
      
      
        '
      
      
        WHERE
      
       a
      
        =
      
      
        '
      
      
        未更新
      
      
        '
      
      
        RAISERROR
      
       (
      
        '
      
      
        不好意思,你沒(méi)有權(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
    

?

?

SQL Server 中關(guān)于 @@error 的一個(gè)小誤區(qū)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 宜丰县| 巢湖市| 锡林郭勒盟| 邹城市| 麻城市| 梧州市| 威信县| 武山县| 营山县| 安庆市| 丰县| 宾川县| 晴隆县| 夏邑县| 麟游县| 阜南县| 桑植县| 赞皇县| 合肥市| 中方县| 加查县| 大荔县| 彰武县| 姜堰市| 阳新县| 梓潼县| 会宁县| 丘北县| 泾川县| 鄂州市| 长垣县| 醴陵市| 建宁县| 呼玛县| 新竹市| 玛沁县| 信阳市| 称多县| 湖口县| 葫芦岛市| 白银市|