首页数据库SQL Server 2005 中使用 Try Catch 处理异常

SQL Server 2005 中使用 Try Catch 处理异常

时间2024-02-29 02:08:03发布访客分类数据库浏览435
导读:收集整理的这篇文章主要介绍了SQL Server 2005 中使用 Try Catch 处理异常,觉得挺不错的,现在分享给大家,也给大家做个参考。 TRY...CATCH是SQL Ser...
收集整理的这篇文章主要介绍了SQL Server 2005 中使用 Try Catch 处理异常,觉得挺不错的,现在分享给大家,也给大家做个参考。

TRY...CATCH是SQL Server 2005/2008令人印象深刻的新特性.提高了开发人员异常处理能力.没有理由不尝试一下Try.. Catch功能.

* TRY 块 - 包含可能产生异常的代码或脚本
* CATCH 块 - 如果TRY块出现异常,代码处理流将被路由到CATCH块.在这里你可以处理异常,记录日志等.
Sql Server中的Try Catch和C#,JAVA等语言的处理方式一脉相承.这种一致性才是最大的创新之处.

一、SQL SERVER 2000中异常处理

CREATE PROC usp_AccountTransaction    @AccountNum INT,    @Amount DECIMAL  AS  BEgin    BEGIN TRANSACTION --beginning a transaction..      UPDATE MyChecking SET amount = Amount - @Amount        WHERE AccountNum = @AccountNum      IF @@ERROR != 0 --check @@ERROR VARiable after each DML statements..      BEGIN        ROLLBACK TRANSACTION --RollBack Transaction if Error..        RETURN      END      ELSE      BEGIN        UPDATE MySavings SET Amount = Amount + @Amount          WHERE AccountNum = @AccountNum        IF @@ERROR != 0 --check @@ERROR variable after each DML statements..        BEGIN          ROLLBACK TRANSACTION --RollBack Transaction if Error..          RETURN        END        ELSE        BEGIN          COMMIT TRANSACTION --finally, Commit the transaction if Success..          RETURN        END      END  END  GO 

上面是Sql server 2000的一个存储过程,在每个数据库操作之后立即必须检查@@ERROR,进行Commit / RollBack该事务.
Sql server 2000中监测错误,只能通过监测全局遍历 @@ERROR.由于@@ERROR会被下一个数据库操作所覆盖. 所以在每次操作完后必须立即监测.

二、SQL SERVER 2005中异常处理

TRY...CATCH是SQL Server 2005提供的更具有可读性的语法.每个开发人员都熟悉这种写法.SQL Server 2005仍然支持@@ERROR这种用法.

1.try catch语法:

BEGIN TRY    Try Statement 1    Try Statement 2    ...    Try Statement M  END TRY  BEGIN CATCH    Catch Statement 1    Catch Statement 2    ...    Catch Statement N  END CATCH 

2.获得错误信息的函数表:

下面系统函数在CATCH块有效.可以用来得到更多的错误信息:

函数 描述

ERROR_NUMBER() 返回导致运行 CATCH 块的错误消息的错误号。
ERROR_SEVERITY() 返回导致 CATCH 块运行的错误消息的严重级别
ERROR_STATE() 返回导致 CATCH 块运行的错误消息的状态号
ERROR_PROCEDURE() 返回出现错误的存储过程名称
ERROR_LINE() 返回发生错误的行号
ERROR_MESSAGE() 返回导致 CATCH 块运行的错误消息的完整文本

简单示例:

BEGIN TRY    SELECT GETDATE()    SELECT 1/0--Evergreen divide by zero example!  END TRY  BEGIN CATCH    SELECT 'There was an error! ' + ERROR_MESSAGE()    RETURN  END CATCH;
     

3.try catch回滚/提交事务的示例

ALTER PROC usp_AccountTransaction    @AccountNum INT,    @Amount DECIMAL  AS  BEGIN    BEGIN TRY --start the Try Block..      BEGIN TRANSACTION -- Start the transaction..        UPDATE MyChecking SET Amount = Amount - @Amount          WHERE AccountNum = @AccountNum        UPDATE MySavings SET Amount = Amount + @Amount          WHERE AccountNum = @AccountNum      COMMIT TRAN -- Transaction Success!    END TRY    BEGIN CATCH      IF @@TRANCOUNT >
     0        ROLLBACK TRAN --RollBack in case of Error      -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception      RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)    END CATCH  END  GO

三、实例讲解

创建错误日志表:

CREATE TABLE ErrorLOG(errNum INT,ErrSev NVArchAR(1000),ErrState INT,ErrProc NVARCHAR(1000),ErrLine INT, ErrMsg NVARCHAR(2000))

创建错误日志记录存储过程:

CREATE PROCEDURE ErrorLogAS    SELECT ERROR_NUMBER() AS ErrNum,ERROR_SEVERITY()AS ErrSev,ERROR_STATE() AS ErrState,ERROR_PROCEDURE() AS ErrProc,ERROR_LINE()AS ErrLine,ERROR_MESSAGE()AS ErrMsg    INSERT    INTO ErrorLog    VALUES(ERROR_NUMBER(),ERROR_SEVERITY(),ERROR_STATE(),ERROR_PROCEDURE(),ERROR_LINE(),ERROR_MESSAGE())GO

写一个存储过程吧!里面使用一下Try Catch:

USE [Your_test]GO/****** Object: StoredProcedure [dbo].[getTodayBirthday]      Script Date: 05/17/2010 15:38:46     Author:jinho    Desc:获取当天生日的所有人    ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE [dbo].[getTodayBirthday]ASBEGIN TRY declare @today datetime;
      SET @today = GETDATE();
    --获取今天的日期 DECLARE @day VARCHAR(2);
     SET @day =REPLACE(DAY(@today),0,'');
     DECLARE @month VARCHAR(2) ;
     SET @month = REPLACE(month(@today),0,'');
     DECLARE @year VARCHAR(4);
     SET @year = YEAR(@today);
     SELECT * From dbo.UserInfo WHERE REPLACE(DAY(CONVERT(DATETIME,Birthday )),0,'') =@day AND REPLACE(MONTH(CONVERT(DATETIME,brithday)),0,'')=@month AND Birthday IS NOT NULL  END TRY BEGIN CATCH ErrorLog --调用上面的存储过程,保存错误日志 END CATCH

说明:ERROR_NUMBER(),ERROR_SEVERITY(),ERROR_STATE(),ERROR_PROCEDURE(),ERROR_LINE(),ERROR_MESSAGE() 这几个函数只能用在Catch里面!

您可能感兴趣的文章:
  • SQL Server出现System.OutOfMemoryException异常的解决方法
  • 解决SQL SERVER数据库备份时出现“操作系统错误5(拒绝访问)。BACKUP DATABASE 正在异常终止。”错误的解决办法
  • SQL Server自定义异常raiserror使用示例
  • SQLServer 连接异常与解决方法小结
  • SQLserver2000 企业版 出现"进程51发生了严重的异常"错误的处理方法
  • SqlServer异常处理常用步骤
  • SQL Server异常代码处理的深入讲解

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: SQL Server 2005 中使用 Try Catch 处理异常
本文地址: https://pptw.com/jishu/632245.html
把CSV文件导入到SQL Server表中的方法 Microsoft Sql server2005的安装步骤图文详解及常见问题解决方案

游客 回复需填写必要信息