我相当彻底地减少了小提琴,但我认为意图很明显。[Def]
是一个[DefaultClassification]
表,[Cls]
是一个[Classification]
包含一些需要添加的旧记录的表。 DefaultClassification 表将在将来用于将新的记录组生成到另一个表中,我们正在“破坏”现有的位这个过程的逻辑/数据。
我尽我最大的努力将整个事情提炼成最基本的要素,但我还有另一个类似的过程在这个过程之后运行,所以我希望学习最佳实践以及为什么这个查询被破坏。
当我写这篇文章时,我打算让它在 2008 年以上的环境中运行,在 SSMS 中编写脚本或手动运行。我不知道它不会被脚本化,但它可能会。现在它完全是手工运行的。最后打印消息上方的回滚和选择是因为它不能正常工作,所以这让我在提交之前验证它。我更喜欢一个有效的脚本,我不必乱用,但是
我遇到的具体问题是该修订版链接http://sqlfiddle.com/#!3/ef71e/1 的第 62 行,它看起来像这样:
右外连接 [Def] tcd
如果我将右侧翻转到左侧,它会执行插入但不检测重复项(以防止插入),如果我执行右侧操作,它会检测重复项但不处理插入。
我打破了什么?为什么?
有人告诉我使用了@@ERROR
不好的 juju,但我不知道为什么,所以这个解释也有奖励积分(100 代表赏金)。
bil*_*nkc 11
在 SQL Server 2005 中,使用 @@ERROR 使检测和捕获错误的工作变得更加困难。
1)您必须在每条语句之后进行测试。仅从维护的角度来看,我的狗护目镜对保护您没有任何作用。您还可以争辩说,用于错误处理的所有复制/粘贴逻辑都会掩盖您代码的“真实”目的。
2) @@ERROR 太不稳定了。在下面的代码中,第 2 行抛出错误 8134。第 3 行我选择了该值,然后消耗了 8134。为什么?因为 SELECT 语句没有引发错误。即使它有,它也将是一个与失败的错误不同的错误。
DECLARE @ErrorCode int
SELECT 1/0 AS div_zero
SELECT @@error AS [@@error]
SET @errorCode = @@error
SELECT @errorCode AS errorCode
Run Code Online (Sandbox Code Playgroud)
3)即使您使用上述 2 处理好 @@ERROR,我面临的挑战是错误仍然“通过”至少在 SSMS 中。运行查询的前半部分,即使我已经从逻辑上处理了错误,它仍然会渗透回调用者。
SET NOCOUNT ON
DECLARE @ErrorCode int;
SELECT 1/0 AS div_zero;
SET @errorCode = @@error;
IF @ErrorCode <> 0
BEGIN
-- I did something here to handle the error
-- SSMS still reports that the Query completed with errors
print 'developer electrocuted';
END
GO
Run Code Online (Sandbox Code Playgroud)
对比一下
-- error handled *and* query executes successfully
BEGIN TRY
-- This will report query executed successfully
SELECT 1/0 AS handled_div_zero;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER()AS error_number --returns the number of the error.
, ERROR_SEVERITY() AS error_severity --returns the severity.
, ERROR_STATE()AS error_state --returns the error state number.
, ERROR_PROCEDURE() AS error_procedure --returns the name of the stored procedure or trigger where the error occurred.
, ERROR_LINE() AS error_line --returns the line number inside the routine that caused the error.
, ERROR_MESSAGE() AS error_message; --returns the complete text of the error message. The text includes the values supplied for any substitutable parameters, such as lengths, object names, or times.
END CATCH
Run Code Online (Sandbox Code Playgroud)
SQL Server 2012 完成了 2005 开始并提供的内容THROW
这允许您处理CATCH
块中的错误,然后您现在可以将相同的错误过滤回调用者,而不是粉碎调用堆栈。否则,您将不得不在每次尝试修复调用堆栈中的级别时引发错误。
归档时间: |
|
查看次数: |
557 次 |
最近记录: |