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

时间:2012-03-17 02:54:47

标签: c# winforms tsql

更新表格中的行数(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

等等..补充说明:

  • 没有数字模式。
  • Source是一个文件,它会从文件更新现有记录的更改。
  • 文件包含对现有记录的修改。我想将这些变化反映到数据库中。请注意我是如何知道ID的。这不是问题。

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

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

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

2 个答案:

答案 0 :(得分:4)

这取决于更新文件的格式。如果它是分隔文件或Excel电子表格,那很简单。使用Sql server批量导入工具将文件导入临时表。然后通过加入更新。如果您的文件格式不易导入,请将其格式化为易于导入的格式。

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

答案 1 :(得分:1)

Brian的某种形状或形式的解决方案是要走的路。对于该数据量,如果您有可以使用的磁盘空间,则完全导入后跟查询更新是最简单,最快速的方法。

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

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

这也是您可能考虑为其构建SSIS包的方案。