【发布时间】:2010-10-18 01:47:32
【问题描述】:
我们有一个主要用 SQL Server 7.0 编写的大型应用程序,其中所有数据库调用都是对存储过程的。 我们现在运行的是 SQL Server 2005,它提供了更多的 T-SQL 功能。
在几乎每次 SELECT、INSERT、UPDATE 和 DELETE 之后,@@ROWCOUNT 和 @@ERROR 都会被捕获到局部变量中并评估问题。如果出现问题,请执行以下操作:
- 错误信息输出参数已设置
- 回滚(如有必要)已完成
- 信息已写入(插入)到日志表中
- 返回一个错误号,对于这个过程是唯一的(如果是致命的,则为正,如果是警告,则为负)
它们都不检查行(仅在已知时),并且有些不同或多或少的日志/调试信息。此外,行逻辑有时会从错误逻辑中分离出来(在 WHERE 子句中检查并发字段的更新中,rows=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 错误处理的任何好的或最佳实践使用。
【问题讨论】:
标签: sql-server sql-server-2005 tsql error-handling