zoukankan      html  css  js  c++  java
  • SQL 异常处理 Begin try end try begin catch end catch

    总结了一下错误捕捉方法:try catch ,@@error,  raiserror

    这是在数据库转换的时候用的的异常处理,

    Begin Try
    Insert into SDT.dbo.DYEmpLostTM(LogDate,ProdGroup,ShiftCode,EmployeeNo,MONo,
    OpNo,OTFlag,LostTypeID,OffStdTime,EmployeeGroup,CMFlag)
    values(@LogDate,@ProdGroup,@ShiftCode,@EmployeeNo,@MONo,@OpNo,@OTFlag,
    @LostTypeID,@OffStdTime,@EmployeeGroup,@CMFlag);

    END try   

    BEGIN CATCH
    DECLARE @Error int
    SET @Error = Error_Number()
    if @Error = 2627   
        Insert into Migration.dbo.DYEmpLostTMError(LogDate,ProdGroup,ShiftCode,EmployeeNo,MONo,
        OpNo,OTFlag,LostTypeID,OffStdTime,EmployeeGroup,CMFlag,ErrorDesc)
        values(@LogDate,@ProdGroup,@ShiftCode,@EmployeeNo,@MONo,@OpNo,@OTFlag,
        @LostTypeID,@OffStdTime,@EmployeeGroup,@CMFlag,Error_Message() );
    END CATCH

     

    错误代码2627:表示
    违反了 %ls 约束 '%.*ls'。不能在对象 '%.*ls' 中插入重复键。

    每个数据库引擎错误都包含以下属性:

      错误代码,消息字符串,严重性,状态,过程名称,行号.

    ERROR_NUMBER() :返回错误号

    ERROR_MESSAGE() :返回错误信息

    ERROR_LINE()        :返回错误所在的行.

    ERROR_PROCEDURE() :返回出现错误的存储过程或触发器的名称。如果在存储过程或触发器中未出现错误,该函数返回 NULL

    ERROR_STATE()     : 返回状态

    ERROR_SEVERITY() : 返回严重性

    ------------------------------------------------------------------------------------------

     

     @@rowcount  返回受上一个语句影响的行数,如果返回的行大于20亿行 的话,用rowcount_big

     

    位于 SELECT 语句之后时,该函数返回由 SELECT 语句返回的行数。

    位于 INSERT、UPDATE 或 DELETE 语句之后时,该函数返回受数据修改语句影响的行数。

    位于 IF 这类不返回行的语句之后时,该函数返回 0。

    ---------------------------------------------------------------------------

    如果在一个语句之后,同时使用@@rowcount ,和@@error的话,必须把这两个放入一个语句中

    update film set filname='aa'
    go
    print @@error

    go
    print @@rowcount

    运行这个语句返回的结果是:

    Msg 207, Level 16, State 1, Line 1
    Invalid column name 'filname'.

    207
    0
    而运行

    update film set filname='aa'
    go
    print @@rowcount

    go
    print @@error

    返回的结果是:

    Msg 207, Level 16, State 1, Line 1
    Invalid column name 'filname'.

    0
    0

    从这两个实例看出:如果运行语句之后想查看是否成功,后面必须紧跟@@error .不能有其他语句:

          update film set filname='aa'
          go
    DECLARE @ERROR INT;
          DECLARE @ROWCOUNT INT;

          SELECT @ERROR=@@ERROR,@ROWCOUNT=@@ROWCOUNT
         
          PRINT @ROWCOUNT
          PRINT @ERROR

    --------------------------------------------------------------------------------

    TRY...CATCH 块不处理导致数据库引擎 终止连接的严重性为 20 或更高的错误。但是,只要连接不终止,TRY...CATCH 就会处理严重性为 20 或更高的错误。

          严重性为 10 或更低的错误被视为警告或信息性消息,TRY...CATCH 块不处理此类错误.

    --------------------------------------------------------Raiserror 异常

    BEGIN CATCH
    SET @Error = Error_Number()
    if @Error <> 2627   
        Raiserror('Unexpected error: "%i"',16,1,@Error) WITH SetError
    end catch

  • 相关阅读:
    [PHP] websocket协议的生成
    [Linux] 解决virtualbox共享文件夹没有访问权限的问题
    [Linux] VirtualBox的ubuntu系统与宿主机共享目录
    [PHP] 框架中.env文件的加载过程
    [PHP] PHP7已经删除了preg_replace的e修饰符
    [日常]解决Connection to `ssl://pecl.php.net:443' failed
    [日常]k8s的前世今生
    [Linux] 利用tcpdump和strace进行debug
    [Go] 使用读写锁对map资源进行安全处理
    [Linux] 使用awk比较两个文件的内容
  • 原文地址:https://www.cnblogs.com/jiangyuxuan/p/2099988.html
Copyright © 2011-2022 走看看