c# - 在 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
解决方案
推荐阅读
- javascript - 如何下载带有标签的外部 .VTT
- c - 在 C 中出错:从不兼容的指针类型传递函数的参数 1
- node.js - 如何在Vue中导入和使用P5.Sound?
- c++ - 代理模型和按钮问题
- flutter - 返回一个未来
而不是布尔 - c# - 当两者都有约束时,从另一个泛型类派生泛型类的语法是什么?
- javascript - 在 React js 表单中预填充图像字段
- firefox - 为什么 Firefox 忽略清单?
- react-native - React Native Elements Checkbox SetState 不是函数
- sql-server - 在 MS sql server-2008 中插入 100 万行