sql - TRY/CATCH block 与 SQL 检查

标签 sql sql-server sql-server-2012 try-catch

简而言之,我想知道以下哪一项是更好的做法:

  • 将我的代码封装在 TRY/CATCH block 中并显示错误消息
  • 编写自己的检查并显示自定义错误消息

据我所知,TRY/CATCH block 并未处理所有类型的错误。在我的情况下,这不是问题。

我正在构建执行特定存储过程的动态 SQL。我可以自己进行检查,例如:

  • 即将执行的过程是否存在
  • 是否提供了所有参数
  • 可以正确转换所有值

或者只是像这样封装语句:

BEGIN TRY           
    EXEC sp_executesql @DynamicSQLStatement
    SET @Status = 'OK'
END TRY
BEGIN CATCH
    SET @Status =  ERROR_MESSAGE()
END CATCH

如果我自己进行检查(例如性能差异)有什么区别吗?或者我应该将这项工作留给服务器?

我问这个问题的原因是因为在某些语言(如 JavaScript)中,使用 try/catch block 被认为是不好的做法。

最佳答案

通常,自己检查这些事情比让 SQL Server 捕获异常更好。正如我在这些帖子中所演示的,异常处理并不便宜:

根据您期望的架构、数量、并发性和故障频率,您的临界点可能会有所不同,因此在非常高的规模下,这可能并不总是绝对最有效的方法。但是,除了在大多数情况下您的情况会更好之外,编写自己的错误处理和预防(虽然需要时间)可以让您完全了解所有错误情况。

话虽如此,您仍然应该将 TRY/CATCH 作为故障保护,因为总有可能出现您未预测到的异常,并且让它优雅地爆炸比扔弹片要好得多无处不在。

关于sql - TRY/CATCH block 与 SQL 检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20126718/

相关文章:

SQL:根据另一个表中多行的值选择一个值

php - PHP 和 SSManagement Studio 中的 TSQL 执行结果不同

SQL "in"与加入删除

sql - 在oracle sql上使用CASE条件

mysql - 连接一条记录中的特定行并从第一个表中检索所有数据

sql - 如何获得带有 group by 的 SQL 报告,并用字符串替换 group by 值?

sql - 选择 group by 子句中的前 n 行

sql-server - Excel VBA - SQL 调用 - 对象关闭时不允许操作

entity-framework - 集成安全如何工作

sql - 为什么delete语句到一个表,lock一个select语句到同一个表--SQL Server