使用硬编码集进行批量更新

本文关键字:更新 编码 | 更新日期: 2023-09-27 18:28:01

更新表中多行(cca 100万)的最快方法是什么,使用标签中的技术?

声明看起来像这样:

UPDATE MyTable SET MyColumn = 2 WHERE MyTable.ID = 1
UPDATE MyTable SET MyColumn = 3 WHERE MyTable.ID = 3
UPDATE MyTable SET MyColumn = 5 WHERE MyTable.ID = 7
UPDATE MyTable SET MyColumn = 1 WHERE MyTable.ID = 45
UPDATE MyTable SET MyColumn = 0 WHERE MyTable.ID = 234

等等。附加说明:

  • 数字没有图案
  • 源是一个文件,它从文件中更新对现有记录的更改
  • 文件包含对现有记录的修改。我希望将这些更改反映到数据库中。注意我是如何知道ID的。这不是问题

另一种可能的描述。给定一个ID列表,并与一个值配对,用ID主键(MyTable.ID)和配对值(MyColumn)更新记录的最快方法是什么?只是为了更清楚。我得到了一个(源)文件,其中写入了一些值。源文件,我从中提取数据以导入(更新)到数据库,如下所示:

2,   1
3,   3
5,   7
1,   45
0,   234

我将接受使用纯TSQL的答案,或者来自ORM或任何其他提供者的答案。

使用硬编码集进行批量更新

这取决于更新文件的格式。如果它是一个分隔文件或Excel电子表格,它非常简单。使用Sql服务器大容量导入工具将文件导入到临时表中。然后通过加入进行更新。如果文件的格式不易于导入,请将其放入易于导入的格式中。

UPDATE
    Table
SET
    Table.col1 = other_table.col1,
    Table.col2 = other_table.col2
FROM
    Table
INNER JOIN
    other_table
ON
    Table.id = other_table.id

https://stackoverflow.com/questions/2334712/sql-server-update-from-select

Brian以某种形式或形式提出的解决方案是可行的。对于这样数量的数据,如果您有足够的磁盘空间,那么完全导入然后从查询更新是最简单、最快的方法。

如果您没有磁盘空间,那么您将需要批量工作。导入5000左右,更新、删除导入的,然后重复。这是一种完整的T/SQL方法。您可以使用BCP实用程序或BULK INSERT语句来导入数据。

对于基于C#的解决方案,可以使用.NET SqlBulkCopy类并为其提供IDataReader源,可以是自定义读取器,也可以是来自OdbcConnection的读取器。

这也是您可能考虑为其构建SSIS包的一种场景。