我有一個主鍵爲mid
的270k行數據庫和一個名爲value
的列,我有一個帶有中間值和值的文本文件。現在我想更新表格,以便將每個值分配給正確的中間值。批量更新SQL Server C#
我目前的做法是從C#中讀取文本文件,並更新表中每行讀取的行。必須有更快的方式來做我感覺的事情..任何想法?
編輯:在表中有其他列,所以我真的需要一個方法來更新根據中。
我有一個主鍵爲mid
的270k行數據庫和一個名爲value
的列,我有一個帶有中間值和值的文本文件。現在我想更新表格,以便將每個值分配給正確的中間值。批量更新SQL Server C#
我目前的做法是從C#中讀取文本文件,並更新表中每行讀取的行。必須有更快的方式來做我感覺的事情..任何想法?
編輯:在表中有其他列,所以我真的需要一個方法來更新根據中。
您可以使用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 2012-04-25 07:55:41
@ Freek8 - 我明白了。是的,這將從文本文件插入。您可以將這些結果存儲在一個臨時表中(使用提供的BULK查詢),然後使用基於臨時表 – 2012-04-25 07:58:37
@ Freek8的UPDATE語句 - 我現在在我的答案中包含了實現此目的所需的SQL。您必須相應地調整表名稱。 – 2012-04-25 08:03:27
你重用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',但它仍然需要很長時間 – Freek8 2012-04-25 08:48:25
SqlBulkCopy進入一個臨時表,或者你可以嘗試更新與TVP。 – 2012-04-25 08:10:19