C# 和 SQL Server 2008 - 批量更新

发布于 2024-12-19 04:02:27 字数 856 浏览 2 评论 0原文

我有一个要求,我需要更新实时数据库表中的数千条记录,尽管该表中有很多列,但我只需要更新 2-3 列。

此外,我不能仅仅为了更新而访问数据库数千次,这可以使用 SQL Server 表值参数在批量更新中完成。但同样,我不应该为了更好的错误处理而一次性更新所有数千条记录,而是希望批量更新 x*100 的记录。

因此,以下是我的方法,请为任何其他替代方案或建议流程中的任何更改提供宝贵的意见 -

  • 1 从数据库中获取所需记录到 ListMainCollection
  • 2 将此集合保存到包含每个元素 Status = Pending 的 XML 文件
  • 3 使用 Status = Pending 从 XML 文件中获取前 'n' 个元素,并将它们添加到新的列表; SubsetCollection
  • 4 循环List; SubsetCollection - 对 T 进行必要的更改
  • 5 转换 List; SubsetCollection 到 DataTable
  • 6 调用更新存储过程并将上面的 DataTable 作为 TVP
  • 7 传递给对应于 List的 XML 元素更新 Status = Processed SubsetCollection
  • 8 如果 XML 文件中存在更多处于 Pending 状态的记录,请转到步骤# 3。

请指导更好的方法或上述过程的任何增强。

I have a requirement where I need to update thousands of records in live database table, and although there are many columns in this table, I only need to update 2-3 columns.

Further I can't hit database for thousand times just for updating which can be done in a batch update using SQL Server Table Valued Parameter. But again I shouldn't update all thousands records in one go for better error handling, instead want to update records in batches of x*100.

So, below is my approach, please give your valuable inputs for any other alternatives or any change in the proposed process -

  • 1 Fetch required records from database to List<T> MainCollection
  • 2 Save this collection to XML file with each element Status = Pending
  • 3 Take first 'n' elements from XML file with Status = Pending and add them to new List<T> SubsetCollection
  • 4 Loop over List<T> SubsetCollection - make required changes to T
  • 5 Convert List<T> SubsetCollection to DataTable
  • 6 Call Update Stored Procedure and pass above DataTable as TVP
  • 7 Update Status = Processed for XML Elements corresponding to List<T> SubsetCollection
  • 8 If more records with Pending status exists in XML file, go to Step# 3.

Please guide for a better approach or any enhancement in above process.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

飞烟轻若梦 2024-12-26 04:02:27

如果可能的话,我会采用仅数据库的方法,如果不可能,则消除最慢的部分。如果您无法完成存储过程中的所有工作,请检索所有记录并进行更改。

下一步是使用 SQL 大容量复制将更改写入临时表。这是快速批量加载,可在几秒钟内复制数千条记录。您将存储主键和要更新的列以及批次号。批号分配给每批记录,因此允许加载另一批记录而不会与第一批记录冲突。

使用服务器上的存储过程根据性能批量处理 100 或 1000 条记录。将批号传递给存储过程。

我们使用这样的方法来批量加载和更新数百万条记录。通过消除网络并允许数据库服务器处理大量工作来获得最佳速度。

我希望这可以为您提供一个可供评估的替代解决方案。

I would do a database-only approach if possible and if not possible, eliminate the parts that will be the slowest. If you are unable to do all the work in a stored procedure, then retrieve all the records and make changes.

The next step is to write the changes to a staging table with SQL Bulk Copy. This is a fast bulk loaded that will copy thousands of records in seconds. You will store the primary key and the columns to be updated as well as a batch number. The batch number is assigned to each batch of records, therefore allowing another batch to be loaded without conflicting with the first batch.

Use a stored procedure on the server to process the records in batches of 100 or 1000 depending on performance. Pass the batch number to the stored procedure.

We use such a method to load and update millions of records in batches. The best speed is obtained by eliminating the network and allowing the database server to handle the bulk of the work.

I hope this might provide you with an alternate solution to evaluate.

热情消退 2024-12-26 04:02:27

这可能不是最佳实践,但您可以在 SQL Server CLR 函数中嵌入一些逻辑。该函数可以由 Query、StoProc 或计划调用以在特定时间运行。

我看到的唯一问题是执行步骤 4 对 T 进行所需的更改。将该逻辑嵌入到数据库中可能不利于维护,但这与将大量业务逻辑嵌入到 StoProcs 中的人没有什么不同。

无论哪种方式,SQL Server CLR 函数都可能是最佳选择。您可以在 Visual Studio 2008、2010 中创建它们(检查数据库新项目类型)。

教程:http://msdn.microsoft.com/ en-us/library/w2kae45k(v=vs.80).aspx

It may not be the best practice but you could embed some logic inside a SQL Server CLR function. This function could be called by a Query,StoProc or a schedule to run at a certain time.

The only issue I can see is getting step 4 to make the required changes on T. Embedding that logic into the database could be detrimental to maintenance, but this is no different to people who embed massive amounts of business logic into StoProcs.

Either way SQL Server CLR functions may be the way to go. You can create them in Visual Studio 2008, 2010 (Check the database new project types).

Tutorial : http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文