我試圖一次更新多行(SQL Server 2005)。以前我是更新單行與此查詢:用WHERE子句更新多行
UPDATE dbo.My_Users
SET MyUserId = @MyUserId
WHERE EmailID = @EmailId
現在@EmailId
將有逗號分隔EmailIds
。
如何修改腳本以更新多行?我見過一些使用UNION ALL
的例子。但他們主要是插入多個記錄沒有where子句。
我試圖一次更新多行(SQL Server 2005)。以前我是更新單行與此查詢:用WHERE子句更新多行
UPDATE dbo.My_Users
SET MyUserId = @MyUserId
WHERE EmailID = @EmailId
現在@EmailId
將有逗號分隔EmailIds
。
如何修改腳本以更新多行?我見過一些使用UNION ALL
的例子。但他們主要是插入多個記錄沒有where子句。
類似的問題得到回答在Parameterize an SQL IN clause
相同的思想可以應用在這裏:
declare @EmailIds varchar = '|[email protected]|[email protected]|';
UPDATE dbo.My_Users SET [email protected] WHERE @EmailIds LIKE '%|' + EmailID + '|%';
雖然這不包含逗號分隔符列表中,分隔符可以很容易地更改爲管道字符。這裏需要注意的是,表中存在的數據越多,@EmailIds列表中的電子郵件地址越多,查詢可能變得越慢(慢得多)。
使用C#,我真的建議在上述問題在列表擴展到創建類似查詢第二個例子:
UPDATE dbo.My_Users SET [email protected] WHERE EmailID IN (@email1, @email2);
C#實現(在本例的修改版本上面的問題):
string[] emails = new string { "[email protected]", "[email protected]" };
string sql = "UPDATE dbo.My_Users SET [email protected] WHERE EmailID IN ({0});"
string[] emailParams = emails.Select((s, i) => "@email" + i.ToString()).ToArray();
string inClause = string.Join(",", emailParams);
using (SqlCommand cmd = new SqlCommand(string.Format(sql, inClause))) {
for(int i = 0; i < emailParams.Length; i++) {
cmd.Parameters.AddWithValue(emailParams[i], emails[i]);
}
}
你可以使用動態SQL
exec('UPDATE dbo.My_Users SET MyUserId = ' + cast(@MyUserId as varchar) + ' WHERE EmailID in (' + @EmailIds + ')')