gpt4 book ai didi

sql-server - 为什么 T-SQL 不会因错误而停止

转载 作者:行者123 更新时间:2023-12-01 00:36:54 25 4
gpt4 key购买 nike

如果我做以下查询

EXEC spFoo
PRINT 'TEST'

spFoo抛出错误,它仍然执行打印语句。

但是,如果我这样做
BEGIN TRY
EXEC cdb.spFoo
PRINT 'TEST'
END TRY
BEGIN CATCH
THROW;
END CATCH

它的行为符合我的预期,并且在出现错误后不会继续。

有人可以为我解释这种行为吗?即使我将其封装在事务中,它仍然会继续。它不仅与打印声明有关,而且与任何其他事物有关。我最初的想法是这是一个严重性问题,但严重性是 16 级。这是正常的 T-SQL 行为吗?如果是这样,是什么促使这种设计与我曾经使用过的所有其他语言相矛盾,从而直接升级错误?

我在 SQL Server 2012、2014 和 2017 中尝试并在多台不同的机器上看到了相同的行为。有问题的存储过程链接到 SQL CLR。

最佳答案

严重性级别为 16 是警告级别。用户需要处理任何错误 - 包括定义何时需要终止。

用你的第一个例子:

EXEC spFoo
PRINT 'TEST'

这些是独立的声明,尽管 spFoo可能会失败,服务器将转到下一个语句。这是因为严重性小于 20,批处理尚未自动终止。

用你的第二个例子,
BEGIN TRY
EXEC cdb.spFoo
PRINT 'TEST'
END TRY
BEGIN CATCH
THROW;
END CATCH

您已经拥有决定什么与什么相关联的所有权。

由于 TRY 中的一项块失败,它不会移动到下一个。
THROW总是终止一个批次。

一旦您调用 THROW ,如果您有任何代码在之后继续,则不会执行。如果这很重要,您可以使用 RAISERROR接着说。

A detailed explanation of errors

Part 2 of explanations

An answer from the same person

Severity levels

关于sql-server - 为什么 T-SQL 不会因错误而停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50365315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com