2012-07-11 85 views
1

我试图一次更新多行(SQL Server 2005)。以前我是更新单行与此查询:用WHERE子句更新多行

UPDATE dbo.My_Users 
SET MyUserId = @MyUserId 
WHERE EmailID = @EmailId 

现在@EmailId将有逗号分隔EmailIds

如何修改脚本以更新多行?我见过一些使用UNION ALL的例子。但他们主要是插入多个记录没有where子句。

回答

1

类似的问题得到回答在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]); 
    } 
} 
0

你可以使用动态SQL

exec('UPDATE dbo.My_Users SET MyUserId = ' + cast(@MyUserId as varchar) + ' WHERE EmailID in (' + @EmailIds + ')')