繁体   English   中英

C#和SQL Server 2008 - 批量更新

[英]C# and SQL Server 2008 - Batch Update

我有一个要求,我需要在实时数据库表中更新数千条记录,虽然这个表中有很多列,但我只需要更新2-3列。

此外,我无法点击数千次只是为了更新,可以使用SQL Server表值参数在批量更新中完成。 但同样,我不应该一次更新所有数千条记录以获得更好的错误处理,而是希望批量更新x * 100中的记录。

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

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

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

如果可能的话,我会做一个仅限数据库的方法,如果不可能,我会删除最慢的部分。 如果您无法在存储过程中执行所有工作,则检索所有记录并进行更改。

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

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

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

我希望这可以为您提供另一种评估方案。

它可能不是最佳实践,但您可以在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM