将尝试捕获捕获该@@ ERROR可以所有的错误? 在下面的代码片段,是值得检查@@ ERROR? 将返回1111曾经发生的呢?
SET XACT_ABORT ON
BEGIN TRANSACTION
BEGIN TRY
--do sql command here <<<<<<<<<<<
SELECT @Error=@@ERROR
IF @Error!=0
BEGIN
IF XACT_STATE()!=0
BEGIN
ROLLBACK TRANSACTION
END
RETURN 1111
END
END TRY
BEGIN CATCH
IF XACT_STATE()!=0
BEGIN
ROLLBACK TRANSACTION
END
RETURN 2222
END CATCH
IF XACT_STATE()=1
BEGIN
COMMIT
END
RETURN 0
下面这篇文章是一个必须由厄兰Sommarskog,SQL服务器MVP阅读: 实现错误使用存储过程处理
另外请注意, 您的TRY块可能失败,并且您的CATCH块可以绕过
还有一件事:当它们与TRY ... CATCH块一起,按照规定使用使用旧式的错误处理和保存点存储过程可能无法正常工作。 避免混合新旧风格的错误处理。
TRY / CATCH陷阱多。 它的巨大和惊人的好。
DECLARE @foo int
SET @foo = 'bob' --batch aborting pre-SQL 2005
SELECT @@ERROR
GO
SELECT @@ERROR --detects 245. But not much use, really if the batch was a stored proc
GO
DECLARE @foo int
BEGIN TRY
SET @foo = 'bob'
SELECT @@ERROR
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE(), ERROR_NUMBER()
END CATCH
GO
在触发器中使用的try / catch也适用。 触发回滚曾经是一批中止过:不再如果TRY / CATCH在触发器中使用过。
你的榜样会更好,如果在BEGIN / ROLLBACK / COMMIT在里面,不在外面,构建
尝试捕捉不会产生陷阱的一切
这里是一些代码来证明
BEGIN TRY
BEGIN TRANSACTION TranA
DECLARE @cond INT;
SET @cond = 'A';
END TRY
BEGIN CATCH
PRINT 'a'
END CATCH;
COMMIT TRAN TranA
服务器:消息3930,级别16,状态1,行9当前事务无法提交,无法支持写入日志文件的操作。 回滚事务。 服务器:消息3998,级别16,状态1,第1行提交的事务是在批处理结束检测。 该事务回滚。
我不相信控制永远不会到达RETURN statement--一旦你在try块的时候,提出的任何错误将控制转移到catch块。 不过,也有一些非常严重的错误,可能会导致该批次甚至连接本身中止(厄兰Sommarskog写在SQL Server错误的话题在这里和这里 -不幸的是,他并没有更新他们包括试试。 ..抓住)。 我不知道,如果你能抓住这些类型的错误,但随后,@@ ERROR也是白搭无论是。
据我的经验,按照联机丛书,的try ... catch块将捕获会产生错误的所有事件(和,因此,设置@@ ERROR为非零值)。 我能想到的任何情况下,这些都不会适用。 因此,没有,返回值永远不会被设置为1111,并且它不会是值得包括@@ ERROR检查。
然而,错误处理是非常重要的,我想我的对冲投注边缘情况下,如DTC,链接服务器,通知或经纪服务,以及其他SQL功能,我已经受够了经验非常少。 如果可以,测试你的比较怪异的情况下,看看有什么会真正发生。
“在try..catch”整点是,这样你就不必检查@@ ERROR的每一个发言。
因此,它是不值得的。