错误处理
在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.
相关的主题文章: