C#和SQL Server 2008批处理更新
我有一个需求,我需要在实时数据库表中更新数千条记录,尽管此表中有很多列,但我只需要更新2-3列。C#和SQL Server 2008批处理更新
此外,我无法仅仅为了更新哪个数据库而使用SQL Server表值参数进行批量更新。但是,我不应该一次更新所有数千条记录以获得更好的错误处理,而是希望以x * 100批次更新记录。
所以,下面是我的方法,请给您的宝贵意见中所提出的过程中任何其他的替代品或任何改变 -
- 1获取从数据库中需要记录
List<T> MainCollection
- 2保存此集合与每个元素的XML文件
Status = Pending
- 3拍摄从XML文件中的第一“N”元素与
Status = Pending
和他们交给添加到新List<T> SubsetCollection
- 4环- 使所需的更改
T
- 5转换
List<T> SubsetCollection
到数据表 - 6呼叫更新存储过程和通过上述数据表作为TVP
- 7更新
Status = Processed
用于对应于List<T> SubsetCollection
- 8 XML元素如果更多的记录与待定状态存在于XML文件中,请转至步骤#3。
请指导以获得更好的方法或在上述过程中的任何增强。
我会做一个唯一的数据库的方法如果可能的话,如果没有可能,消除,这将是最慢的部分。如果您无法完成存储过程中的所有工作,请检索所有记录并进行更改。
下一步是使用SQL批量复制将更改写入临时表。这是一个快速批量加载,可以在几秒钟内复制数千条记录。您将存储主键和要更新的列以及批号。批号分配给每批记录,因此允许加载另一批而不与第一批冲突。
使用服务器上的存储过程以根据性能批处理100或1000个记录。将批号传递给存储过程。
我们使用这种方法来批量加载和更新数百万条记录。通过消除网络并允许数据库服务器处理大部分工作来获得最佳速度。
我希望这可能会为您提供一个替代解决方案来评估。
虽然我使用了与我在前面提到的相同的方法问题 - 我将此标记为分享想法和提出针对问题的不同方法的答案:-) – iniki
这可能不是最好的做法,但可以在SQL Server CLR函数中嵌入一些逻辑。这个函数可以通过查询,StoProc或计划在特定时间运行。
我可以看到的唯一问题是获取步骤4在T
上进行所需更改。将该逻辑嵌入数据库可能对维护不利,但对于将大量业务逻辑嵌入到StoProcs中的人来说,这并没有什么不同。
无论哪种方式SQL Server CLR函数可能是要走的路。您可以在Visual Studio 2008,2010中创建它们(检查数据库中的新项目类型)。
教程:http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx
创建CLR对象是一件棘手的事情......他们很难调试。 – JesseBuesking
如果你做得对,他们是一个真正的宝石。你可以用一些IoC策略来调试它们。即IDbConnection等。 – Jeremy
用大***如果**; p – JesseBuesking
如果数据来自同一个数据库,也许尝试一个CLR函数?您可以用C#编写它,并且可以让它在您的数据库上进行分割,而不用担心分批执行这些操作。 – Jeremy
信息可在这里:http://msdn.microsoft.com/en-us/library/ms189876.aspx – Jeremy
这是从你的[早期问题](http://stackoverflow.com/questions/8318614/c-尖锐分批更新到使用-存储过程数据库)? –