首页 > 解决方案 > 在 try catch 中缺少插入表

问题描述

我有一个读取服务总线并执行存储过程的 C# 应用程序。它有 5 个步骤,一个是将此数据插入表中,然后对其进行操作(它是我们的 ETL)。数据库是 SQL Server。

该过程将数据正确插入STG.Table1,但插入的第二条语句DWH.Table1有时不会插入,但既不会将错误捕获到 Log 也不会 C# 应用程序。验证列是一个计算列,用于验证 json 是否有效。

对于我丢失的近 200k 条记录,我丢失了 5k,我丢失了DWH.Table1表中 3% 的数据。

这是我的代码。我希望你能帮助我,我真的很感激。

我的存储过程:

DECLARE @tableid TABLE (id bigint);
DECLARE @id BIGINT;
DECLARE @json_id VARCHAR(32);

BEGIN TRANSACTION

    INSERT INTO STG.Table1 (c1, c2) 
    OUTPUT inserted.id INTO @tableid 
    VALUES (@v1, @v2);

COMMIT TRANSACTION

BEGIN TRY

    SELECT @id = id FROM @tableid

    SELECT @json_id = JSON_VALUE(t.json,'$.json_id')
    FROM STG.Table1 t
    INNER JOIN @tableid doc ON t.id = doc.id
    WHERE validated = 'True'
    
    BEGIN TRANSACTION
    
        INSERT INTO DWH.Table1 ([Id], [json_id])
            SELECT  
                t.id,
                JSON_VALUE(t.json,'$.json_id') transaction_id
            FROM 
                STG.Table1 t
            INNER JOIN 
                @tableid t1 ON t.id = t1.id
            WHERE 
                validated = 'True'
        
    COMMIT TRANSACTION

    SELECT id FROM @tableid
END TRY

BEGIN CATCH
    DECLARE
        @errorLine INT = ERROR_LINE(),
        @errorProcedure NVARCHAR(128) = ERROR_PROCEDURE(),
        @errorMessage NVARCHAR(4000) = ERROR_MESSAGE(),
        @reportMessage NVARCHAR(4000)
    
    SET @reportMessage = CONCAT('Line ', @errorLine, ' :: ', @errorMessage,' :: json_id = ',@json_id)

    INSERT INTO PRC.LOGS (errorProcedure, reportMessage)  
    VALUES (@errorProcedure, @reportMessage)
        
    DELETE FROM STG.Table1
    WHERE id = @id;
    
    THROW
END CATCH

标签: c#sql-servertry-catchmissing-data

解决方案


推荐阅读