博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sql Server2005 Transact-SQL 新兵器学习总结之-TRY…CATCH
阅读量:6993 次
发布时间:2019-06-27

本文共 2192 字,大约阅读时间需要 7 分钟。

Transact-SQL 代码中的错误可使用 TRY…CATCH 构造处理,此功能类似于C#语言的异常处理功能。TRY…CATCH 构造包括两部分:一个 TRY 块和一个 CATCH

1.TRY...CATCH 块不处理导致数据库引擎关闭连接的严重性为 20 或更高的错误。但是,只要连接不关闭,TRY...CATCH 就会处理严重性为 20 或更高的错误。

2.严重性为 10 或更低的错误被视为警告或信息性消息,TRY...CATCH 块不处理此类错误。

 

对于与TRY...CATCH 构造在同一执行级别发生的错误,TRY...CATCH 将不处理以下两类错误:

1.编译错误,例如阻止批处理执行的语法错误。

2.语句级重新编译过程中出现的错误,例如由于名称解析延迟而造成在编译后出现对象名解析错误。

--由SELECT 语句生成的对象名解析错误是不被TRY…CATCH 构造捕捉
BEGIN TRY
    -- Table does not exist
     SELECT * FROM Table1;
 END TRY
 BEGIN CATCH
     SELECT 
         ERROR_NUMBER() AS ErrorNumber,
         ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage;
END CATCH

 

如果某个错误在 TRY 块内的编写或语句级别重新编写过程中并在较低的执行级别(例如,执行 sp_executesql 或用户定义存储过程时)发生,则该错误会在低于 TRY…CATCH 构造的级别上发生,并由相关联的 CATCH 块处理。

 CREATE PROCEDURE pr_1
 AS
      -- Table does not exist
     SELECT * FROM Table1;
 GO
 
 BEGIN TRY
     EXECUTE pr_1
 END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage;
END CATCH;

 

2007年12月3日13:53:38

 

--ids 主键
 create table test1( ids int not null,
 constraint pk_test1  primary key(ids)
 )
 go
 select * from test1
 begin try
 
     BEGIN TRAN
    insert into test1 (ids)
    select 1
    insert into test1 (ids)
    select 2
    insert into test1 (ids)
   select 1  --违反了主键约束
    COMMIT TRAN
    PRINT 'Transaction committed'
end try
begin catch
    ROLLBACK
    PRINT 'Transaction rolled back'
    SELECT
    ERROR_NUMBER() AS ErrorNumber,
    ERROR_SEVERITY() AS ErrorSeverity,
    ERROR_STATE() AS ErrorState,
    ERROR_PROCEDURE() AS ErrorProcedure,
    ERROR_LINE() AS ErrorLine,
    ERROR_MESSAGE() AS ErrorMessage;
end catch
select * from test1

 

TRY...CATCH 使用下列错误函数来捕获错误信息:

ERROR_NUMBER() 返回错误号。

ERROR_MESSAGE() 返回错误消息的完整文本。此文本包括为任何可替换参数(如长度、对象名或时间)提供的值。

ERROR_SEVERITY() 返回错误严重性。

ERROR_STATE() 返回错误状态号。

ERROR_LINE() 返回导致错误的例程中的行号。

ERROR_PROCEDURE() 返回出现错误的存储过程或触发器的名称。

 

BEGIN TRY
    SELECT 1/0;
END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage;
END CATCH;

转载地址:http://rxivl.baihongyu.com/

你可能感兴趣的文章
php之验证码
查看>>
struts2文件上传
查看>>
Linux more命令
查看>>
linux监控系统_Zabbix3.0安装过程(n)
查看>>
linux rinetd、socat端口转发部署
查看>>
云服务器 ECS Linux Centos 7 系统 下iptables 服务的使用概述
查看>>
CodeForces 552C Vanya and Scales
查看>>
还原一个真实的华为存储
查看>>
【原创】MySQL 最新商业版备份工具使用方法
查看>>
使用Python开发一个超级简单的接水果小游戏,零基础也可以学会
查看>>
ruby.taobao.org
查看>>
mysql 5.1 变量专题
查看>>
MyEclipse6.5下struts2+spring2+hibernate3 整合
查看>>
android中的JSON解析
查看>>
我的友情链接
查看>>
js模拟表单提交
查看>>
微信小程序开发简易计算器改进版
查看>>
混合背包问题
查看>>
Android studio树形
查看>>
hihoCoder1043
查看>>