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

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 ErrorLog
AS
   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 ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[getTodayBirthday]
AS
BEGIN 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
, 异常
, try
catch
mssql try catch、sql server try catch、sqlserver try catch、mssqlserver2005下载、mssqlserver2005 64位,以便于您获取更多的相关知识。

时间: 2024-11-17 21:52:27

SQL Server 2005 中使用 Try Catch 处理异常_mssql2005的相关文章

sql server 2005中新增加的try catch学习

server sql server 2005中新增加的try catch,可以很容易捕捉异常了,今天大概学习看了下,归纳下要点如下 基本用法BEGIN TRY     {  sql_statement |  statement_block  }END TRYBEGIN CATCH     {  sql_statement |  statement_block }END CATCH,和普通语言的异常处理用法差不多,但要注意的是,SQL SERVER只捕捉那些不是严重的异常,当比如数据库不能连接等这

在SQL Server 2005中解决死锁

server|解决 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁. use Northwind begin tran     insert into Orders(CustomerId) values('ALFKI')     waitfor delay '00:00:05'     select * from Ord

Microsoft SQL Server 2005 中的 XML 选项

本文介绍 Visual Studio 2005/SQL Server 2005 环境中用于处理 XML 数据的三个选项,包括使用方案以及指导用户在各选项之间进行选择的指南. 一.System.Xml.SQLXML 和 XML 数据类型简介 本节简要介绍 Microsoft SQL Server 2000 中提供的 XML 支持的发展历史,并概要介绍 Microsoft Visual Studio 2005/SQL Server 2005 环境中提供的用于处理 XML 和关系数据的三个选项.这三个

SQL Server 2005中的T-SQL增强

server 丰富的数据类型 Richer Data Types 1.varchar(max).nvarchar(max)和varbinary(max)数据类型最多可以保存2GB的数据,可以取代text.ntext或image数据类型.CREATE TABLE myTable(    id INT,    content VARCHAR(MAX)) 2.XML数据类型XML数据类型允许用户在SQL Server数据库中保存XML片段或文档. 错误处理 Error Handling 1.新的异常处

SQL Server 2005中三种插入XML数据的方法

server|xml|插入|数据 我们知道SQL Server 2005中增加了XML类型,也就是说在创建表的时候可以指定某一列为XML类型,如:CREATE TABLE customers(  name VARCHAR(20) NOT NULL PRIMARY KEY,    description XML) 那么如何向XML类型的列中插入数据呢?基本上有三种办法:1.直接使用字符串,如INSERT INTO customers (feedName, feedXML) VALUES  ('Ra

SQL Server 2005中的DDL触发器的实现

server|触发器     SQL SERVER 2005中,新增加了许多新的特性,其中的DDL触发器是个不错的选择,根据资料初步学习如下,现整理之:    在sql server 2000中,只能为针对表发出的 DML 语句(INSERT.UPDATE 和 DELETE)定义 AFTER 触发器.SQL Server 2005 可以就整个服务器或数据库的某个范围为 DDL 事件定义触发器.可以为单个 DDL 语句(例如,CREATE_TABLE)或者为一组语句(例如,DDL_DATABASE

使用 SQL Server 2005中的 CLR 集成

本文描述了数据库应用程序开发人员和架构师如何利用 SQL Server 2005 中的 CLR 集成功能.本文对基于 CLR 的编程方式与 SQL Server 中支持的现有编程模型(如 TransacT-SQL 和扩展存储过程)进行了比较,并且强调了各自相对的优缺点.还提供了一组选择合适的编程替代方法的高级指导,以及一些示例和代码示例. 一.简介 Microsoft 通过宿主 Microsoft .NET Framework 2.0 公共语言运行库 (CLR),SQL Server 2005显

Microsoft SQL Server 2005 中的 XML 支持(3)

四.SQL Server 2005 中的客户端 XML 处理 XML 数据类型的客户端支持.NET 框架 V2.0 中的 ADO.NET XML 支持 在 SqlDataReader.GetSqlXml() 方法的 System.Data.SqlTypes 命名空间中,XML 数据类型是作为类 SqlXml 公开的.可以使用 SqlXml.CreateReader() 函数从 SqlXml 对象获得 XmlReader. 类型化 XML 列的 XML 架构集合的名称由三部分组成,可以从 XML

Microsoft SQL Server 2005 中的 XML 支持(1)

本文探讨 SQL Server 2005 中内置的 XML 支持.描述了这种支持如何与 .NET 框架 V2.0 和本机代码(例如 OLEDB 和 SQLXML)均支持的客户端编程相集成. 一.简介 可扩展标记语言 (XML) 作为一种与平台无关的数据表示形式已被广泛采用.它对于在松散耦合且完全不同的系统,以及各种企业到企业 (B2B) 应用和工作流范畴内交换信息是很有用的.数据交换已成为 XML 技术的主要驱动力之一.. XML 在企业应用程序中的使用正日益广泛,它主要用于对半结构化和非结构化