使用WHERE子句更新多行

时间:2012-07-11 14:31:06

标签: sql-server-2005

我正在尝试一次更新多行(SQL Server 2005)。以前我用这个查询更新了一行:

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

现在@EmailId将以逗号分隔EmailIds

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

2 个答案:

答案 0 :(得分:1)

Parameterize an SQL IN clause

中回答了类似的问题

同样的想法可以在这里应用:

declare @EmailIds varchar = '|email1@test.com|email2@test.com|';
UPDATE dbo.My_Users SET MyUserId=@MyUserId WHERE @EmailIds LIKE '%|' + EmailID + '|%';

虽然这不包含以逗号分隔的列表,但分隔符很容易更改为管道符。需要注意的是,表中存在的数据越多,@ EmailIds列表中的电子邮件地址越多,此查询就越慢(慢得多)。

使用C#,我实际上会推荐上述问题中的第二个例子,其中扩展列表以创建类似于的查询:

UPDATE dbo.My_Users SET MyUserId=@MyUserId WHERE EmailID IN (@email1, @email2);

要实现的C#(上述问题中示例的修改版本):

string[] emails = new string { "email1@test.com", "email2@test.com" };
string sql = "UPDATE dbo.My_Users SET MyUserId=@MyUserId 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]);
    }
}

答案 1 :(得分:0)

您可以使用动态SQL

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