首页 > 解决方案 > Catch 块不在存储过程中执行

问题描述

我有一个应该从数据库中删除模式的存储过程。我从后端执行这个存储过程(使用 C#)。结果,如果删除成功与否,我想接收布尔值。

var result = await session.Sp<bool>(c => c.spDeleteSchemaTotally, new { schemaName})
                                         .SingleAsync()
                                         .ConfigureAwait(false);

if (result)
{
     tracer.Info("Deleted successfully");
}
else
{
     tracer.Warn("Schema was not deleted appropriately");
}

存储过程:

ALTER PROCEDURE [dbo].[spDeleteSchemaTotally]
    (@schemaName NVARCHAR(100))
AS
    SET FMTONLY OFF
BEGIN TRY
    UPDATE SchemaList
    SET [Status] = 2 /* DELETING */
    WHERE SchemaName = @schemaName

    EXEC [dbo].[spDeleteSchema] @schemaName

    EXEC [dbo].[spDeleteSchemaOwner] @schemaName

    EXEC [dbo].[spDeleteSchemaUserRoles] @schemaName

    UPDATE SchemaList
    SET [Status] = 1 /* DELETED */,
        SchemaName = SchemaName + '|deleted|' + FORMAT(GETUTCDATE(), 'MM-d-yyyy-hh:mm')
    WHERE SchemaName = @schemaName

    SELECT CAST(1 AS BIT);
END TRY
BEGIN CATCH
    UPDATE SchemaList
    SET [Status] = 3 /* ERRORED */
    WHERE SchemaName = @schemaName

    SELECT CAST(0 AS BIT);
END CATCH 

我有一个表,其中存储了所有模式的列表。对于每个模式,我都有一些状态。每个模式都有一些自己的表、规则等。

但是由于某些原因,我注意到(有时)发生了一些错误,并且模式留下了状态 2(正在删除)。什么样的错误 - 我不知道,因为无法抓住这一刻。

逻辑上认为,存储过程内部发生了一些错误,但为此,我有 catch 块。根据这个主题,一些内部存储过程中的错误应该由外部捕获处理。所以我认为一切都以正确的方式编写......但不正确的行为仍然存在。

有人可以指出我在上述存储过程中处理错误的正确方法吗?

我正在使用 SQL Server。

标签: c#sqlsql-serverstored-procedureserror-handling

解决方案


如果每个内部存储过程都具有 Try-Catch 构造,则需要将 THROW 命令添加到每个内部 SP 的 Catch 块中。

它将向外部 SP 抛出错误,您将能够对其进行跟踪。

这个想法是,如果内部 SP 发生错误并带有 Try-Catch 块,则外部 SP 不会失败并且不知道有错误。

抛出文档

Try-Catch 文档


推荐阅读