2012-04-25 94 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