请大家详细的说说
@@error
xact_abort
try/catch
这三种异常捕获机制的 异同点
@@error
xact_abort
try/catch
这三种异常捕获机制的 异同点
解决方案 »
- 用sql server 2005
- 简单的查询语句?求解
- select *from abc 能不能将第1列数据重复的再显示在表后面呢?马上结贴,从不拖拉。
- STATISTICS_NORECOMPUTE
- Reporting Services设置字体格式?
- 关于一句insert语句的错误
- +++++++++zjcxc(: 邹建 :) ,victorycyz(中海) 请进+++++++++++
- 怎样使图片加载在sql数据库中,而图片不是以文件的形式存在的呀?请高手赐教!
- 我是初学者,关于程序实现和Sql后台实现的一些问题向请教大家
- 求解一个sql的写法
- SQL SERVER 2005 在两台服务器之间创建链接服务器错误,请帮忙
- SQL Server 数据库罕见异常
指定当 Transact-SQL 语句产生运行时错误时,Microsoft® SQL Server™ 是否自动回滚当前事务。这个跟另外两个不一样啊。
具体参见http://msdn.microsoft.com/zh-cn/library/ms188790.aspx
TRY……CATCH是一个捕获异常的语句,主要用来在存储过程中捕获某一段代码的异常
http://msdn.microsoft.com/zh-cn/library/ms175976.aspx
XACT_ABORT这个主要用于对于事务如果发生异常,可以回滚
http://msdn.microsoft.com/zh-cn/library/ms188792.aspx
http://msdn.microsoft.com/zh-cn/library/ms190193(v=SQL.90).aspx
所以,你没执行一条语句,都需要判断一次,如果有错误,那就rollback,如果一个存储过程中,有好多语句,那没你需要判断N次,非常不方便。
2.xact_abort是只要在执行语句中报错了,那么系统自动回滚,非常方便,而且能在系统出现某些错误时,也能回滚,比如,delete from t,而这个表t根本不存在的时候,这个选项,仍然能回滚。3.try catch,就和很多高级程序一样,捕获异常,然后处理异常。但自己在使用时发现,在存储过程中,有些异常用try catch,根本捕获不到,这个时候异常会返回到更上层,所以一般在用的时候,都是这样的:create proc proc_t(@i int)
asselect 5 * 1.0 / @i
go
--1.不会报错
begin try
begin tran
exec proc_t 1
select '执行成功'
commit tran
end try
begin catch
select '执行失败'
if @@trancount >0
rollback
end catch
--2.这次会报错,因为分母为0
begin try
begin tran
exec proc_t 0
select '执行成功'
commit tran
end try
begin catch
select '执行失败'
if @@trancount >0
rollback
end catch
这样,就可以捕获存储过程抛出的异常
参考 http://technet.microsoft.com/zh-cn/library/ms188790(v=sql.105).aspxxact_abort 指定当 Transact-SQL 语句出现运行时错误时,SQL Server 是否自动回滚到当前事务。
参考 http://technet.microsoft.com/zh-cn/library/ms188792(v=sql.105).aspxtry/catch 对 Transact-SQL 实现与 Microsoft Visual C# 和 Microsoft Visual C++ 语言中的异常处理类似的错误处理。Transact-SQL 语句组可以包含在 TRY 块中。如果 TRY 块内部发生错误,则会将控制传递给 CATCH 块中包含的另一个语句组。
参考 http://technet.microsoft.com/zh-cn/library/ms175976(v=sql.105).aspx三者一般是结合使用的,以下经典用法.-- 1.适用于SQL2000.
set xact_abort on
begin tran
[事务代码]
commit tran-- 2.适用于SQL2000.
begin tran
[事务语句1]
if @@error<>0
begin
rollback tran
goto ext
end
[事务语句2]
if @@error<>0
begin
rollback tran
goto ext
end
commit tran
ext:
select error_message()-- 3.适用于SQL2005,2008.
begin try
begin tran
[事务代码]
commit tran
end try
begin catch
rollback tran
select error_number() as error_number ,
error_message() as error_message,
error_state() as error_state,
error_severity() as error_severity
end catch