使用硬编码集进行批量更新
本文关键字:更新 编码 | 更新日期: 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包的一种场景。