【问题标题】:Bulk update SQL Server C#批量更新 SQL Server C#
【发布时间】:2012-05-05 21:19:37
【问题描述】:

我有一个包含主键 mid 和一个名为 value 的列的 270k 行数据库,并且我有一个包含中间值和值的文本文件。现在我想更新表格,以便将每个值分配给正确的中间值。

我目前的方法是从 C# 读取文本文件,并为我读取的每一行更新表中的一行。必须有更快的方法来做我认为的事情......有什么想法吗?

编辑:表中还有其他列,所以我真的需要一个方法来更新根据mid。

【问题讨论】:

  • SqlBulkCopy 到临时表中,或者您可以尝试使用 TVP 进行更新。

标签: c# .net sql sql-server tsql


【解决方案1】:

您可以使用 SQL Server 导入和导出向导:

http://msdn.microsoft.com/en-us/library/ms141209.aspx

您也可以使用BULK TSQL 语句:

BULK
INSERT YourTable
FROM 'c:\YourTextFile.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO


SELECT * FROM YourTable
GO

假设您在逗号分隔符上进行拆分。如果您使用其他字符(例如空格),请将 FIELDTERMINATOR 更改为相关字符。

编辑(从我的评论中实现更新):

UPDATE RealTable
SET value = tt.value
FROM
  RealTable r
INNER JOIN temp_table tt ON r.mid = tt.mid

【讨论】:

  • 谢谢。如果我是正确的,这不会更新而是插入到表中,对吗?我用额外的信息编辑了我的问题,我深表歉意。使用您的方法创建一个新表然后在中间加入它们怎么样?
  • @Freek8 - 啊我明白了。是的,这将从文本文件中插入。您可以将这些结果存储在临时表中(使用提供的 BULK 查询),然后使用基于临时表的 UPDATE 语句
  • @Freek8 - 我现在已经在我的答案中包含了实现这一目标所需的 SQL。您将不得不相应地调整表名。
  • 我认为这仍然需要很长时间,也许和我最初的想法一样长(read a line, update a row)
  • @Freek8 - 取决于索引是集群还是非集群。在这种情况下,您将使用非聚集索引。将完全是 SQL Server 解释查询和编写执行计划的方式。您可以应用它并包含实际的执行计划,并通过它决定它是否加快/减慢它。
【解决方案2】:

你会重复使用SqlCommand吗?

    struct Item
    {
        public int mid;
        public int value;
    }

    public int Update(string connectionstring)
    {
        int res = 0;
        using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
        using (cmd.Connection = new System.Data.SqlClient.SqlConnection(connectionstring))
        {
            cmd.CommandText = @"UPDATE [table] SET [value] = @value WHERE [mid] = @mid;";
            cmd.CommandType = CommandType.Text;
            System.Data.SqlClient.SqlParameter mid = cmd.Parameters.Add("@mid", SqlDbType.VarChar);
            System.Data.SqlClient.SqlParameter value = cmd.Parameters.Add("@value", SqlDbType.VarChar);
            try
            {
                cmd.Connection.Open();
                foreach (Item item in GetItems("pathttothefile"))
                {
                    mid.Value = item.mid;
                    value.Value = item.value;
                    res += cmd.ExecuteNonQuery();
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                cmd.Connection.Close();
            }
        }
        return res;
    }

    IEnumerable<Item> GetItems(string path)
    {
        string[] line;
        foreach (var item in System.IO.File.ReadLines(path))
        {
            line = item.Split(',');
            yield return new Item() { mid = int.Parse(line[0]), value = int.Parse(line[1]) };
        }
    }

【讨论】:

  • 是的,我正在重用sqlcommand,但它仍然需要很长时间
猜你喜欢
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
相关资源
最近更新 更多