【问题标题】:TSQL: Nested Try-Catch does not capture inner catchTSQL:嵌套的 Try-Catch 不捕获内部捕获
【发布时间】:2018-04-18 08:11:57
【问题描述】:

我有以下存储过程语句:

DECLARE @CurrentId BIGINT
DECLARE @FailedRecord NVARCHAR(MAX) = ''

BEGIN TRY -- 1st Try
    INSERT INTO #tmpNewApp
        SELECT Id, Email, Content 
        FROM dbo.NewApplication

    WHILE EXISTS(SELECT * FROM #tmpNewApp)
    BEGIN
        BEGIN TRY -- 2nd Try
            SET @CurrentId = (SELECT TOP 1 Id FROM #tmpNewApp)

            INSERT INTO EmailSending
                SELECT Email, Content 
                FROM #tmpNewApp 
                WHERE Id = @CurrentId
        END TRY
        BEGIN CATCH -- 2nd Catch
            SET @FailedRecord = @FailedRecord + ', ' + @CurrentId;
        END CATCH

        DELETE FROM #tmpNewApp 
        WHERE Id = @CurrentId
    END
END TRY
BEGIN CATCH -- 1st Catch
    INSERT INTO DatabaseException
    SELECT ERROR_MESSAGE(), GETDATE()
END CATCH

SELECT @FailedRecord

我正在尝试获取在循环期间遇到异常的 ID 列表。但是,@FailedRecord 总是返回空,DatabaseException 总是能够捕获异常,这似乎是第二个 CATCH 被第一个 CATCH 捕获,而第二个 CATCH 中的语句被忽略了。

为什么会这样?

【问题讨论】:

    标签: tsql stored-procedures sql-server-2014


    【解决方案1】:

    @FailedRecord 始终返回空 - 您第二次捕获始终返回错误“将数据类型 varchar 转换为 bigint 时出错。”

    1. 使用转换/转换你的 BigInt

      SET @FailedRecord = @FailedRecord + ', ' + Cast(@CurrentId as VARCHAR(20))

    2. 第一次 Try/Catch 仅适用于错误(或错误转换:))

      INSERT INTO #tmpNewApp SELECT Id, Email,Content FROM dbo.NewApplication

    在第二次捕获或测试值时将插入移动到 DatabaseException 并将错误消息存储在变量中

     IF @FailedRecord <> '' 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-27
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 2015-03-31
      • 2011-05-27
      • 1970-01-01
      相关资源
      最近更新 更多