我们有一款主要使用SQL Server 7.0编写的大型应用程序,其中所有数据库调用都是通过存储过程完成的。我们现在正在运行SQL Server 2005 ,它提供了更多的T-SQL功能。
在几乎每个SELECT、INSERT、UPDATE和DELETE之后,都会捕获@@ROWCOUNT和@@ERROR到本地变量并进行问题评估。如果存在问题,则执行以下操作:
- 设置错误消息输出参数
- 回滚(如果必要)
- 将信息写入日志表(INSERT)
- 返回一个错误号,该号码对于此存储过程是唯一的(正数表示致命错误,负数表示警告)
他们都不检查行数(仅在已知情况下检查),有些差异的记录/调试信息也是如此。而且,行逻辑有时会与错误逻辑分开(在更新中,WHERE子句中检查并发字段,行= 0表示其他人已更新数据)。但是,这里是一个相当通用的示例:
SELECT, INSERT, UPDATE, or DELETE
SELECT @Error=@@ERROR, @Rows=@@ROWCOUNT
IF @Rows!=1 OR @Error!=0
BEGIN
SET @ErrorMsg='ERROR 20, ' + ISNULL(OBJECT_NAME(@@PROCID), 'unknown')
+ ' - unable to ???????? the ????.'
IF @@TRANCOUNT >0
BEGIN
ROLLBACK
END
SET @LogInfo=ISNULL(@LogInfo,'')+'; '+ISNULL(@ErrorMsg,'')+
+ ' @YYYYY=' +dbo.FormatString(@YYYYY)
+', @XXXXX=' +dbo.FormatString(@XXXXX)
+', Error=' +dbo.FormatString(@Error)
+', Rows=' +dbo.FormatString(@Rows)
INSERT INTO MyLogTable (...,Message) VALUES (....,@LogInfo)
RETURN 20
END
我正在研究使用TRY-CATCH T-SQL来替换我们目前的做法。我已经阅读了TRY...CATCH (Transact-SQL)语法,所以请不要只给出一些摘要信息。我正在寻找任何好的想法和如何最好地执行或改进我们的错误处理方法。它不一定需要是Try-Catch,只要是T-SQL错误处理的任何好的或最佳实践。