2012-09-23 20 views
1

我有這個疑問:更新數千行的

s="update myTable set date='09/09/12' where crc32 in("+list+")"; 

但是因爲我的清單是用成千上萬的價值我認爲有更好的方式來做到這一點。我不知道是哪一種方式,或者如何。

更新:列crc32intlist是字符串像:

list = "2345,-6467,7865,7654,...." 

我用c#執行查詢。 list包含我無法通過sql查詢獲取它們的值,只是通過我的代碼。

謝謝

+0

什麼是列表類型? –

+0

什麼樣的數據存儲在列表中? – Freelancer

+0

想想如果'名單會發生什麼= 「1234); DELETE FROM mytable的WHERE 1英寸(1」' – Seph

回答

2

檢查表值參數。 http://msdn.microsoft.com/en-us/library/bb510489.aspx把它放在一個存儲過程,如:

create procedure mysp 
@tvp tvp_list readonly 
as 
update mt 
set date='09/09/12' 
from mytable mt 
join @tvp t on tvp.id = crc32 

而且從C#與數據表的參數包含您的CRC32

var cmd = new SqlCommand(CommandText = "prc_update",conn); 

... 

var dt = new DataTable(); 
dt.Columns.Add("crc32",typeof(string)); 
..... you can add more if you like 
foreach(var item in myList) 
{ 
    var row = dt.NewRow(); 
    row["crc32"] = item; 
    dt.Rows.Add(row); 
} 

cmd.Parameters.Add("@tvp", System.Data.SqlDbType.Structured); 
cmd.Parameters["@tvp"].Value = dt; 

..... 

conn.Open(); 
cmd.ExecuteNonQuery(); 
+0

的可能性,我不明白的存儲過程如何幫助我。如果你能解釋一下我,謝謝 –

+0

一個TVP是basicly名單。我猜你的列表看起來像'crc1,crc2,crc3,crc4'。以數據的形式發送數據比以字符串的形式發送數據要簡單(不管是int還是string) db。爲了能夠使用tvp,你需要用tvp來調用一個存儲過程,並且這個過程看起來就像我向你展示的那樣,這是一個通用的實現,在那個TVP中你可以放任何你想要的東西,更復雜的條件爲您的加入。 –

+0

此外,使用字符串,你被限制在t他可以在列表中發送的參數數量。解析也會變慢,依此類推。使用表格(tvp)對於sql來說都很自然。 –

1

List在某處的數據庫調用它呢?

與一個JOINUPDATE是可能會比較快,它甚至可能更快地創建一個表,把List它,然後做UPDATEJOIN

+0

不,這個列表是我的c#代碼中的一個變量 –