1

一度に複数の行を更新しようとしています (SQL Server 2005)。以前は、次のクエリで単一の行を更新していました。

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

@EmailIdこれでカンマ区切りになりますEmailIds

複数の行を更新するようにスクリプトを変更するにはどうすればよいですか? を利用した例をいくつか見てきUNION ALLました。ただし、ほとんどの場合、where 句を使用せずに複数のレコードを挿入します。

4

2 に答える 2

1

SQL IN 句のパラメータ化で同様の質問が回答されました

ここでも同じ考え方を適用できます。

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

これにはカンマ区切りのリストは含まれていませんが、区切り文字は簡単にパイプ文字に変更できます。ここでの注意点は、テーブルに存在するデータが多く、@EmailIds リストにある電子メール アドレスが多いほど、このクエリが遅くなる (はるかに遅くなる) ことです。

C# を使用して、実際には上記の質問の 2 番目の例をお勧めします。この例では、リストを展開して次のようなクエリを作成します。

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]);
    }
}
于 2012-07-11T14:45:30.460 に答える
0

動的SQLを使用できます

exec('UPDATE dbo.My_Users SET MyUserId = ' + cast(@MyUserId as varchar) + ' WHERE EmailID in (' + @EmailIds + ')')
于 2012-07-11T14:33:56.020 に答える