• SQL 异常处理 Begin try end try begin catch end catch转


    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

    http://blog.csdn.net/wobuwei/archive/2009/08/18/4459019.aspx

  • 相关阅读:
    如何在linux系统中设置静态ip地址
    spring 学习
    java 反射机制和invoke方法
    CentoS7装机
    eclipse 添加jar包的方式
    No-args constructor for class does not exist. Register an InstanceCreator with G
    freemarker页面如何获取绝对路径basePath
    MySQL备份还原
    MySQL用户授权与权限
    CentOS7修改SSH远程连接端口
  • 原文地址:https://www.cnblogs.com/renyb/p/2480605.html
Copyright © 2020-2023  润新知