• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 涵韵 | 发布时间: 2025-6-18 14:15| 查看数: 129| 评论数: 0|帖子模式

    TRY...CATCH是Sql Server 2005/2008令人印象深刻的新特性.提高了开发人员异常处理能力.没有理由不尝试一下Try.. Catch功能.
    * TRY 块 - 包含可能产生异常的代码或脚本
    * CATCH 块 - 如果TRY块出现异常,代码处理流将被路由到CATCH块.在这里你可以处理异常,记录日志等.
    Sql Server中的Try Catch和C#,JAVA等语言的处理方式一脉相承.这种一致性才是最大的创新之处.
    一、SQL SERVER 2000中异常处理
    1. CREATE PROC usp_AccountTransaction

    2.   @AccountNum INT,

    3.   @Amount DECIMAL

    4. AS

    5. BEGIN

    6.   BEGIN TRANSACTION --beginning a transaction..

    7.     UPDATE MyChecking SET Amount = Amount - @Amount

    8.       WHERE AccountNum = @AccountNum

    9.     IF @@ERROR != 0 --check @@ERROR variable after each DML statements..

    10.     BEGIN

    11.       ROLLBACK TRANSACTION --RollBack Transaction if Error..

    12.       RETURN

    13.     END

    14.     ELSE

    15.     BEGIN

    16.       UPDATE MySavings SET Amount = Amount + @Amount

    17.         WHERE AccountNum = @AccountNum

    18.       IF @@ERROR != 0 --check @@ERROR variable after each DML statements..

    19.       BEGIN

    20.         ROLLBACK TRANSACTION --RollBack Transaction if Error..

    21.         RETURN

    22.       END

    23.       ELSE

    24.       BEGIN

    25.         COMMIT TRANSACTION --finally, Commit the transaction if Success..

    26.         RETURN

    27.       END

    28.     END

    29. END

    30. 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语法:
    1. BEGIN TRY

    2.   Try Statement 1

    3.   Try Statement 2

    4.   ...

    5.   Try Statement M

    6. END TRY

    7. BEGIN CATCH

    8.   Catch Statement 1

    9.   Catch Statement 2

    10.   ...

    11.   Catch Statement N

    12. END CATCH
    复制代码
    2.获得错误信息的函数表:
    下面系统函数在CATCH块有效.可以用来得到更多的错误信息:

    函数 描述

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

    2.   SELECT GETDATE()

    3.   SELECT 1/0--Evergreen divide by zero example!

    4. END TRY

    5. BEGIN CATCH

    6.   SELECT 'There was an error! ' + ERROR_MESSAGE()

    7.   RETURN

    8. END CATCH;
    复制代码
    3.try catch回滚/提交事务的示例
    1. ALTER PROC usp_AccountTransaction

    2.   @AccountNum INT,

    3.   @Amount DECIMAL

    4. AS

    5. BEGIN

    6.   BEGIN TRY --Start the Try Block..

    7.     BEGIN TRANSACTION -- Start the transaction..

    8.       UPDATE MyChecking SET Amount = Amount - @Amount

    9.         WHERE AccountNum = @AccountNum

    10.       UPDATE MySavings SET Amount = Amount + @Amount

    11.         WHERE AccountNum = @AccountNum

    12.     COMMIT TRAN -- Transaction Success!

    13.   END TRY

    14.   BEGIN CATCH

    15.     IF @@TRANCOUNT > 0

    16.       ROLLBACK TRAN --RollBack in case of Error

    17.     -- you can Raise ERROR with RAISEERROR() Statement including the details of the exception

    18.     RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)

    19.   END CATCH

    20. END

    21. GO
    复制代码
    三、实例讲解
    创建错误日志表:
    1. CREATE TABLE ErrorLog(errNum INT,ErrSev NVARCHAR(1000),ErrState INT,ErrProc NVARCHAR(1000),ErrLine INT, ErrMsg NVARCHAR(2000))
    复制代码
    创建错误日志记录存储过程:
    1. CREATE PROCEDURE ErrorLog
    2. AS
    3.    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
    4.    INSERT
    5.    INTO ErrorLog
    6.    VALUES(ERROR_NUMBER(),ERROR_SEVERITY(),ERROR_STATE(),ERROR_PROCEDURE(),ERROR_LINE(),ERROR_MESSAGE())
    7. GO
    复制代码
    写一个存储过程吧!里面使用一下Try Catch:
    1. USE [Your_Test]
    2. GO
    3. /****** Object: StoredProcedure [dbo].[getTodayBirthday]  
    4.     Script Date: 05/17/2010 15:38:46
    5.     Author:jinho
    6.     Desc:获取当天生日的所有人
    7.     ******/
    8. SET ANSI_NULLS ON
    9. GO
    10. SET QUOTED_IDENTIFIER ON
    11. GO
    12. ALTER PROCEDURE [dbo].[getTodayBirthday]
    13. AS
    14. BEGIN TRY
    15. declare @today datetime;
    16. SET @today = GETDATE();--获取今天的日期
    17. DECLARE @day VARCHAR(2);
    18. SET @day =REPLACE(DAY(@today),0,'');
    19. DECLARE @month VARCHAR(2) ;
    20. SET @month = REPLACE(month(@today),0,'');
    21. DECLARE @year VARCHAR(4);
    22. SET @year = YEAR(@today);
    23. 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

    24. END TRY
    25. BEGIN CATCH
    26. ErrorLog --调用上面的存储过程,保存错误日志
    27. END CATCH
    复制代码
    说明:ERROR_NUMBER(),ERROR_SEVERITY(),ERROR_STATE(),ERROR_PROCEDURE(),ERROR_LINE(),ERROR_MESSAGE() 这几个函数只能用在Catch里面!

    来源:https://www.jb51.net/article/83379.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表