sql2008异常处理

xiaofan_sap 2013-08-08 10:14:56
请大家详细的说说
@@error
xact_abort
try/catch
这三种异常捕获机制的 异同点
...全文
167 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2013-10-20
  • 打赏
  • 举报
回复
@@error 返回执行的上一个 Transact-SQL 语句的错误号。 参考 http://technet.microsoft.com/zh-cn/library/ms188790(v=sql.105).aspx xact_abort 指定当 Transact-SQL 语句出现运行时错误时,SQL Server 是否自动回滚到当前事务。 参考 http://technet.microsoft.com/zh-cn/library/ms188792(v=sql.105).aspx try/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
潇洒王子 2013-10-19
  • 打赏
  • 举报
回复
可以按实际需要来选择
LongRui888 2013-10-19
  • 打赏
  • 举报
回复
1.@@error 是每次执行一个语句,就会系统就会修改@@error的值,以体现语句是否报错, 所以,你没执行一条语句,都需要判断一次,如果有错误,那就rollback,如果一个存储过程中,有好多语句,那没你需要判断N次,非常不方便。 2.xact_abort是只要在执行语句中报错了,那么系统自动回滚,非常方便,而且能在系统出现某些错误时,也能回滚,比如,delete from t,而这个表t根本不存在的时候,这个选项,仍然能回滚。 3.try catch,就和很多高级程序一样,捕获异常,然后处理异常。但自己在使用时发现,在存储过程中,有些异常用try catch,根本捕获不到,这个时候异常会返回到更上层,所以一般在用的时候,都是这样的:
create proc proc_t(@i int)
as

select 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
这样,就可以捕获存储过程抛出的异常
Andy__Huang 2013-08-08
  • 打赏
  • 举报
回复
参考: http://msdn.microsoft.com/zh-cn/library/ms190193(v=SQL.90).aspx
KeepSayingNo 2013-08-08
  • 打赏
  • 举报
回复
@@ERROR是一个系统变量,会在存储过程遇到错误时返回一个错误号 具体参见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
Shawn 2013-08-08
  • 打赏
  • 举报
回复
#1.功能上没什么相同的地方。如果非要有,就是都可以用在异常处理。 #2.不同的地方,就是功能不同,使用方法不同。参考楼上各位,应该不会让你失望的。
Mr_Nice 2013-08-08
  • 打赏
  • 举报
回复
各司其职 Try catch 用于发现错误 ↓ @@error 可以定位出具体错误号(在 sys.messages 列表中) ↓ XACT_ABORT 错误发生时,SQL Server 该如何处理(是否自动回滚)
KevinLiu 2013-08-08
  • 打赏
  • 举报
回复
SET XACT_ABORT 指定当 Transact-SQL 语句产生运行时错误时,Microsoft® SQL Server™ 是否自动回滚当前事务。 这个跟另外两个不一样啊。
-Tracy-McGrady- 2013-08-08
  • 打赏
  • 举报
回复
我也想听听。
發糞塗牆 2013-08-08
  • 打赏
  • 举报
回复
联机丛书上应该说的比较明白了吧?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧