- - PR -
ADO.NETでのIN演算子について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-03-28 22:51
皆さんはじめまして。
申し訳ありませんが質問させてください。 ADO.NETを使用していますが、IN演算子を使用したSQLで 問題があり、困っています。 SELECT * FROM A WHERE A.XXX IN (@PARAMETER) このようなSQLを書いた場合、@PARAMETERには何をセットしたら よいのでしょうか? 配列はダメなようですし、シングルクォートで囲いカンマで区切った文字列 (「'AAA','BBB'」のような形式)では単独の文字列として扱われているようです。 どなたかご教示をお願いいたします。 | ||||
|
投稿日時: 2005-03-29 00:22
単純にSQLの質問ですか?
IN ('AAA','BBB') ということですか?あと、サブクエリもかけます。 | ||||
|
投稿日時: 2005-03-29 01:32
説明が足りなくて申し訳ありません。
SQLというより、ADO.NETでの実装についてです。 実際は、 SqlCommand command = new SqlCommand( "SELECT * FROM A WHERE A.XXX IN (@PARAMETER)"); command.Parameters.Add("@PARAMETER", "'AAA','BBB'") ; ←ここ この部分にセットするべきオブジェクトが何かわからないでいます。 上記のようにすると、どうも「'AAA','BBB'」という単独の文字列として セットされているようで、想定された検索結果が得られません。 お知恵を貸していただけるとありがたいです。 書き忘れていましたが、DBはMSDEを使っています。 | ||||
|
投稿日時: 2005-03-29 02:11
レコードを取得したいのではないのですか? SELECT * FROM A WHERE A.XXX IN ('AAA','BBB') じゃだめですかね?そもそもIN演算子にパラメータ使うことってあるのでしょうか? (パラメータは詳しくないので力になれてないかも) | ||||
|
投稿日時: 2005-03-29 02:44
ご返答ありがとうございます。
想定された結果とは、A.XXXが'AAA'または'BBB'のレコードが取得されることですが、 私のコードでは検索結果はゼロ件でした。 OSQLから同じSQLを直接実行した場合は想定通りの検索結果が得られました。 最後の手段として直接SQL文字列を編集して実装するつもりですが ・SQLインジェクション対策をしたくない ・パラメータの使用、SQL文字列が固定であることを前提としたライブラリが 既に実装されている(この件以外では有効に使えています) この二つの理由で出来れば避けたいと思っています。 もっとも間に合わなくなれば贅沢を言ってはいられないのですが。 | ||||
|
投稿日時: 2005-03-29 06:05
記憶が不確かなのですが、
SqlCommand command = new SqlCommand( "SELECT * FROM A WHERE A.XXX IN (@PARAM1, @PARAM2)"); command.Parameters.Add("@PARAM1", "AAA") ; command.Parameters.Add("@PARAM2", "BBB") ; で動きませんか。 | ||||
|
投稿日時: 2005-03-29 10:06
未確認ですが、ベーちゃん様のおっしゃるとおりのSQLで動くと思われます。
ただ、また説明不足で恐縮ですが、INの要素数は可変となります。 つまり、 'AAA','BBB','CCC' ということがありえます。 このため複数の要素を一つのパラメータで指定する方法が無いかが問題となっていました。 時間が無いので(すでにスケジュールぎりぎりでして・・・)クエリ文字列を直接 切り貼りする方法で実装しようと思いますが、もしも良い方法をご存知でしたら ご教示ください。 | ||||
|
投稿日時: 2005-03-29 10:12
普通に動的にSQL文とSQLパラメータを生成するだけの話だと思います。
ちなみにINのパラメータがユーザーに入力される値ならば、かならずパラメータを使用すべきです。 |