2012-04-25 111 views
3

我有一个主键为mid的270k行数据库和一个名为value的列,我有一个带有中间值和值的文本文件。现在我想更新表格,以便将每个值分配给正确的中间值。批量更新SQL Server C#

我目前的做法是从C#中读取文本文件,并更新表中每行读取的行。必须有更快的方式来做我感觉的事情..任何想法?

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

+0

SqlBulkCopy进入一个临时表,或者你可以尝试更新与TVP。 – 2012-04-25 08:10:19

回答

7

您可以使用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 
+0

谢谢。如果我是正确的,这将不会更新,但插入表中,对吧?我编辑我的问题与额外的信息,我的道歉。如何使用你的方法创建一个新表,然后加入他们呢? – Freek8 2012-04-25 07:55:41

+0

@ Freek8 - 我明白了。是的,这将从文本文件插入。您可以将这些结果存储在一个临时表中(使用提供的BULK查询),然后使用基于临时表 – 2012-04-25 07:58:37

+0

@ Freek8的UPDATE语句 - 我现在在我的答案中包含了实现此目的所需的SQL。您必须相应地调整表名称。 – 2012-04-25 08:03:27

1

你重用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]) }; 
     } 
    } 
+0

是的,我正在重复使用'sqlcommand',但它仍然需要很长时间 – Freek8 2012-04-25 08:48:25