加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

关于SQLServer2005的学习笔记――异常捕获及处理

发布时间:2020-12-12 15:23:36 所属栏目:MsSql教程 来源:网络整理
导读:SQLServer2005 提供了类似于 C# 和 C++ 语言中的异常处理的错误处理机制。 ? Transact-SQL 语句组可以包含在 TRY 块中。如果 TRY 块内部发生错误,则会将控制传递给 CATCH 块中包含的另一个语句组。 ? 相关错误消息如下: ERROR_NUMBER() 返回错误号。 ERROR
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读