我正在尝试一次更新多行(SQL Server 2005)。以前我用这个查询更新单行:
UPDATE dbo.My_Users
SET MyUserId = @MyUserId
WHERE EmailID = @EmailId
现在@EmailId
将有逗号分隔EmailIds
。
如何修改脚本以更新多行?我看过一些使用UNION ALL
. 但它们大多是插入多条记录而没有 where 子句。
我正在尝试一次更新多行(SQL Server 2005)。以前我用这个查询更新单行:
UPDATE dbo.My_Users
SET MyUserId = @MyUserId
WHERE EmailID = @EmailId
现在@EmailId
将有逗号分隔EmailIds
。
如何修改脚本以更新多行?我看过一些使用UNION ALL
. 但它们大多是插入多条记录而没有 where 子句。
在Parameterize an SQL IN 子句中回答了类似的问题
在这里可以应用相同的想法:
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]);
}
}
您可以使用动态 SQL
exec('UPDATE dbo.My_Users SET MyUserId = ' + cast(@MyUserId as varchar) + ' WHERE EmailID in (' + @EmailIds + ')')