2011-11-30 20 views
0

データセットをIN値として使用する方法はありますか?選択値INデータセット

たとえば、私は仕事をしているときにユーザーが選択できるオプションでデータセットを読み込むクエリを持っています。問題は、DataSetをロードするクエリが非常に長くて厄介なことです(他の選択や他のテーブル結合などの内部で選択とテーブルの結合が行われる)ので、DataSetを正確に1回だけ埋めたいと思っています他のクエリを実行しているときにDataSetを参照するだけです。

今は、各行を呼び出し、行から値を取得し、それをクエリに追加することによって機能するようになっています。

//GetAvailableOptions is just the long and complicated query 
//Code simplified just for example sake 
DataSet ds = GetAvailableOptions(); 
string str_qry = "select from TestFile where ("; 
foreach(DataRow dr in ds.Tables[0].Rows) 
{ 
    string str_test = dr[0].ToString(); 
    str_qry += dr[0].ToString() + " or "; 
} 

だから、結果のクエリは次のようになります。

select from TestFile where (TestField = 'A' or TestField = 'B' or ... TestField = 'Z') 

しかし、私は次の操作を行って、より速くそれを作ることができなかった場合、私は思っていた:「

DataSet ds = GetAvailableOptions(); 
string str_qry = "select from TestFile where TestField in " + ds.Tables[0].Columns[0]; 

をしかし、私はすることができますそれを働かせてください。これは可能ですか?私の論理は響きますか? DataSetから参照しようとしている列の名前は、ロードしようとしているフィールド(この例ではTestField)と同じです。

もう1つ、もっと主観的な質問があると思いますが、これが機能するかどうかは、どれだけ速くなりますか?または結合と複数のクエリでも、ループして追加するのではなく、そこから引き出す方が速いでしょうか?それとも私が考えなかった別の方法があるのでしょうか?誰かが自分の経験を共有できますか?

答えて

1

これは、ストアドプロシージャとしてよく行われているようです。作成しているDataSetがストアドプロシージャから作成されていると仮定します。

また、生成している動的SQLのタイプは、さまざまな理由でベストプラクティスではなく、セキュリティのうちの主なものであり、SQLインジェクションまで自分自身を開きます。

1

あなたが後に続く列を返すデータは、複雑な結合であると言えますが、もしそうなら、これは実際にすべてサーバー上で実行できますか?だから、複雑なユーザデータを検索し、サーバ上のクライアント上で構築している選択を実行する新しいストアドプロシージャを組み立てますか?

+0

これは実際にこれを行うより良い方法を提示しているので、私はこれを投票しました。しかし、教育目的のためだけに、私が元々提出したことができたかどうか知っていますか? – Gobbledigook

関連する問題