【问题标题】:How can I track failed CRUD rows when using bulk insert/update/delete?使用批量插入/更新/删除时如何跟踪失败的 CRUD 行?
【发布时间】:2017-03-03 08:56:15
【问题描述】:
我试图弄清楚如何对 SQL 数据库中的表执行批量操作,以便能够处理失败的行。
假设我在表中批量插入 10 行,而第 5 行有一些错误数据,无法插入。然后我希望插入其他 9 行,但以某种方式能够获得无法插入的 1 行作为回报,因此我可以将此行存储在某个位置以供以后错误处理。
如果我可以使用一些 nuget 包进行 C# 编程,那就太好了。
【问题讨论】:
-
你考虑过SSIS吗?集成服务允许您将数据从源传输到目标。可以选择将失败的行重定向到另一个目标。
标签:
c#
sql
sql-server
merge
bulk
【解决方案1】:
通常,最佳解决方案是在流程中尽早验证不良数据。考虑以下策略。
- 在您的 C# 代码中创建一个数据表,其中数据列与需要持久化的目标表的数据类型、长度、可为空值等精确匹配。如果任何数据不符合要求,它会在尝试插入数据表时抛出异常。
- 从源数据填充数据表,一次一个数据行。如果一行未能插入到数据表中,您的异常处理可能会捕获该行并根据需要记录该数据。
- 在 SQL Server 中创建自定义表值类型以匹配数据表。确保所有内容都匹配,包括每个数据列的所有元数据。
- 在 SQL Server 上创建一个包含 table-values 输入参数的存储过程。此参数将是在步骤 3 中创建的新自定义类型。然后可以使用表值参数将数据快速插入到数据库表中。
- 将数据表作为参数值传递给存储过程。数据类型应为 SqlDbType.Structured。
这种设计通过早期输入验证提高了速度和效率,同时允许该过程批量传递数据,从而实现快速插入。
【解决方案2】:
我猜你可以做一个触发器而不是插入,检查数据是否有效。如果不是,您可以将其保存在另一个表中,您将从该表中检索有错误的行,如果该行中没有错误,您可以将其插入原始表中。