2011年(103)
分类: 数据库开发技术
2011-05-04 23:10:35
SQLServer2005提供了类似于C#和C++语言中的异常处理的错误处理机制。
Transact-SQL语句组可以包含在TRY块中。如果TRY块内部发生错误,则会将控制传递给CATCH块中包含的另一个语句组。
相关错误消息如下:
ERROR_NUMBER()返回错误号。
ERROR_SEVERITY()返回严重性。
ERROR_STATE()返回错误状态号。
ERROR_PROCEDURE()返回出现错误的存储过程或触发器的名称。
ERROR_LINE()返回导致错误的例程中的行号。
ERROR_MESSAGE()返回错误消息的完整文本。
--让我们看看SQLServer2000下的错误捕获,对于某些错误实际上是无法捕获的
DECLARE @ErrNum INT,@RowCount INT; --能够捕获的0做除数错误 SELECT 1/0; SET @ErrNum=@@error; SET @RowCount=@@rowcount; PRINT 'Encount ERROR'; PRINT @ErrNum PRINT @RowCount --不能被捕获的数据转换错误 SELECT 'A'+1 SET @ErrNum=@@error; SET @RowCount=@@rowcount; PRINT 'Encount Serious ERROR'; PRINT @ErrNum PRINT @RowCount |
--创建一张通用日志表,以捕获代码执行过程中的相关错误
CREATE TABLE LogTable ( ID INT IDENTITY (1,1) NOT NULL, ErrorNumber INT, ErrorMessage VARCHAR(1000), ErrorSeverity INT, ErrorState INT, ErrorLine INT, ErrorProcedure VARCHAR(128) ); |
--创建一个存储过程,以进行错误捕获
CREATE PROCEDURE TestTryCatchProc AS --相关业务逻辑 BEGIN TRY SELECT 1/0; END TRY --相关错误捕获 BEGIN CATCH PRINT 'Error Numberv' + CAST(ERROR_NUMBER() AS VARCHAR(10)); PRINT 'Error Serverity: ' + CAST(ERROR_SEVERITY() AS VARCHAR(10)); PRINT 'Error State: ' + CAST(ERROR_STATE() AS VARCHAR(10)); PRINT 'Error Procedure: ' + ERROR_PROCEDURE(); PRINT 'Error Line: ' + CAST(ERROR_LINE() AS VARCHAR(10)); PRINT 'Error Message: ' + ERROR_MESSAGE(); INSERT INTO LogTable(ErrorNumber,ErrorSeverity,ErrorState,ErrorProcedure,ErrorLine,ErrorMessage) VALUES(ERROR_NUMBER(),ERROR_SEVERITY(),ERROR_STATE(),ERROR_PROCEDURE(),ERROR_LINE(),ERROR_MESSAGE()) --此处可以先对相关错误进行修正 END CATCH; --执行相关存储过程,并查询日志表,同时与系统消息表进行对比 EXEC TestTryCatchProc SELECT * FROM LogTable SELECT * FROM sys.messages WHERE message_id=8134 AND language_id=2052 |
参考
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/8c16ecdf-68f4-4a2a-b594-086e3344e58a.htm
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.zh-CHS/tsqlref9/html/248df62a-7334-4bca-8262-235a28f4b07f.htm