1. ホーム
  2. sql

[解決済み] SQLのIN句をパラメータ化する

2022-03-19 12:04:53

質問

を含むクエリをどのようにパラメータ化するのですか? IN このように、引数の数が可変の節は、どうすればよいのでしょうか?

SELECT * FROM Tags 
WHERE Name IN ('ruby','rails','scruffy','rubyonrails')
ORDER BY Count DESC

このクエリでは、引数の数は1から5までのいずれかにすることができます。

このために専用のストアドプロシージャ(またはXML)を使うのは避けたいのですが、もし SQL Server 2008 私はそれを受け入れることができます。

どのように解決するのですか?

ここでは、私が使ったことのある手っ取り早いテクニックを紹介します。

SELECT * FROM Tags
WHERE '|ruby|rails|scruffy|rubyonrails|'
LIKE '%|' + Name + '|%'

では、C#のコードです。

string[] tags = new string[] { "ruby", "rails", "scruffy", "rubyonrails" };
const string cmdText = "select * from tags where '|' + @tags + '|' like '%|' + Name + '|%'";

using (SqlCommand cmd = new SqlCommand(cmdText)) {
   cmd.Parameters.AddWithValue("@tags", string.Join("|", tags);
}

注意点が2つあります。

  • 性能は最悪です。 LIKE "%...%" クエリーはインデックスされません。
  • がないことを確認してください。 | 空白、またはNULLタグを使用しないと動作しません。

この他にも、人によってはよりクリーンと思われる実現方法がありますので、ぜひ読み進めてみてください。