raid57341026 » SQL SERVER200错误处理数据库

错误处理

在SQL Server2000中出现的错误具有以下几个特点:

  • 错误号:每个错误状态都对应{wy}的错误号。
  • 错误信息字符串:错误信息提供了有关错误原因的诊断信息。许多错误信息都有替换变量,其中包含一些信息,如产生错误的对象名称。每个错误号都对应{wy}的错误信息。
  • 严重度:严重度表示错误的严重程度。严重度较低的错误,如1级或2级,为信息性消息或低级警告。严重度较高的错误表明问题需要尽快解决。
  • 状态代码:一些错误代码可能在SQL Server源代码中多处出现。如,几种不同情况下都可能发生1105错误。出现错误代码的每一处都指派了{wy}的状态代码。可以使用错误的状态代码在源代码中查找错误代码的位置,这可以为问题的诊断提供参考。
  • 过程名:如果在存储过程中发生错误,则该存储过程的名称也许可用。
  • 行号:行号指出存储过程中产生错误的语句。

系统的所有错误都存储在系统表master.dbo.sysmessages中。用户定义的消息也可以存储在此系统表中。如果需要,可以使用RAISERROR语句将这些用户定义的错误返回到一个应用程序。

所有的API,如ADO、OLE DB、ODBC、DB-Library和嵌入式SQL,均报告基本的错误属性:错误号和消息字符串。然而,每个数据库所能报告的其他错误特性的数量是不同的。

a.使用@@ERROR全局变量处理错误

@@ERROR全局变量返回{zh1}执行的T-SQL语句的错误代码。当SQL Server完成T-SQL语句的执行时,如果语句执行成功,则@@ERROR设置为0,。若出现一个错误,则返回一条错误信息。@@ERROR返回此错误信息代码,直到另一条T-SQL语句被执行。

由于@@ERROR在每一条语句执行后被xx并且重置,所以应在语句验证后立即检查它,或将其保存到一个局部变量中以备事后查看。

在SQL Server中,可以使用下面两种方法对@@ERROR进行处理:

  • 在T-SQL语句后,马上检测或使用@@ERROR
  • 在T-SQL语句完成后,马上把@@ERROR存储到一个整形变量中

例:

USE bookdb
GO
SELECT * FROM book
GO
IF @@ERROR=0
PRINT ‘执行成功!’
ELSE
PRINT ‘查询出错!’
GO

执行上面语句,则在"网络"窗口中显示查询结果,而在"消息"窗口中显示"执行成功"的字样。

b.使用RAISERROR

在上面的操作中,使用PRINT可以显示一些提示信息。与PRINT相比,RAISERROR在把消息返回给应用程序方面的功能更强大。RAISERROR能以下列方式中的任意一种返回消息:

  • 已通过sp_addmessage系统存储过程添加到master.dbo.sysmessages上的由用户定义的错误信息。
  • 在RAISERROR语句中指定的消息字符串。

除此以外,它还具有PRINT功能的一些扩展:

  • RAISERROR能够指派一个特定的错误号、严重度和状态。
  • RAISERROR能够请求将错误记入SQL Server2000错误日志和Windows NT应用程序日志中。
  • 消息字符串可以包含替代变量和参数,这与C语言中的printf功能相似。

当RAISERROR在sysmessages中与用户定义消息的msg_id一同使用时,msg_id被作为SQL Server的错误号码或本机错误代码返回。而当RAISERROR与msg_str而不是msg_id一同使用时,返回的SQL Server的错误号和本机错误号为50000。

例:在返回给应用程序的消息中替换了DB_ID和DB_NAME函数的值。

DECLARE @DBID INT
SET @DBID=DB_ID()
DECLARE @DBNAME NVARCHAR(128)
SET @DBNAME=DB_NAME()
RAISERROR(’The current database ID is:%d,the database name is:%s.’,16,1,@DBID,@DBNAME)

执行结果为:

:消息50000,级别16,状态1,行7

The current database ID is:6,the database name is:Northwind.

而以下例子使用用户定义的消息完成了同样的处理:

EXEC sp_addmessage 50005,16,’The current database ID is:%d,the database name is:%s.’,'us_english’
GO
DECLARE @DBID INT
SET @DBID=DB_ID()
DECLARE @DBNAME NVARCHAR(128)
SET @DBNAME=DB_NAME()
RAISERROR(50005,16,1,@DBID,@DBNAME)
GO

执行结果为:

服务器:消息50005,级别16,状态1,行7

The current database ID is:6,the database name is:Northwind.

相关的主题文章:

评论审阅已启用。您的评论可能需要一段时间才会出现。

郑重声明:资讯 【raid57341026 » SQL SERVER200错误处理数据库】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——