使用批量 insert/update/delete 时如何跟踪失败的 CRUD 行?

How can I track failed CRUD rows when using bulk insert/update/delete?

我想弄清楚如何对 SQL 数据库中的 table 执行批量操作,以便能够处理失败的行。

假设我将 10 行批量插入到 table 中,但第 5 行有一些错误数据,无法插入。然后我想要插入其他 9 行,但以某种方式能够获得无法插入 return 的 1 行,因此我可以将此行存储在某个地方以供以后处理错误。

如果我可以使用一些 nuget 包进行 C# 编程,那就太好了。

我想你可以做一个触发器而不是插入,检查数据是否有效。如果不是,您可以将其保存在另一个 table 中,您将从那里检索有错误的行,如果行中没有错误,您可以将其插入原始 table.

通常,最佳解决方案是尽可能早地验证错误数据。考虑以下策略。

  1. 在您的 C# 代码中创建一个数据table,其中的数据列与需要持久化的目标 table 的数据类型、长度、可空性等精确匹配。如果任何数据不符合,它将在尝试插入数据时抛出异常table。
  2. 从您的源数据中填充数据table,一次一个数据行。如果某行无法插入数据table,您的异常处理可以捕获该行并根据需要记录该数据。
  3. 在 SQL 服务器中创建自定义 table 值类型以匹配数据 table。确保所有内容都匹配,包括每个数据列的所有元数据。
  4. 在 SQL 服务器上创建包含 table-values 输入参数的存储过程。此参数将是在步骤 3 中创建的新自定义类型。然后可以使用 table 值参数将数据快速插入数据库 tables。
  5. 将您的数据table 作为参数值传递给存储过程。数据类型应为 SqlDbType.Structured.

此设计通过早期输入验证提高了速度和效率,同时允许进程批量传递数据,从而实现快速插入。