2011-07-19 11 views
2

私が偏っていると言って始めましょう。私はすべての状況下で動的SQLが嫌いです。つまり、このシナリオは動的SQLの優れたプラクティスと考えられていますか?この場合、動的SQLを使用しても問題ありませんか?

sqlDataSourceObject.SelectCommand = String.Concat(
        "select top ", maxRows, 
        " col1, ", 
        " col2 as myData, ", 
        " '' as blah, ", 
        " col3 as Fromperson ", 
        " 'Corporate' as toPerson, ", 
        " Convert(char(11), orderDate) as orderDate, ", 
        " carrier, ", 
        sqlString1, 
        sqlString2, 
        sqlString3 + " AND areaCode = '" + currArea + "'" 
        ); 

このクエリは、sqlString1,2,3, or currAreaの値を変更し、異なるSqlDataSourceコントロールに対して再びそれを実行し、その後、一回実行されることがあります。

このコードは、私が読むのを怒らせます。その読みにくい、それはsqlString変数で変更することができます、私はコピーせずに実行することはできません/ SSMSに貼り付け、私は単一の変更を行うためにいくつかの変数を追跡する必要があります。

しかし、私は私が偏っていますので、私はあなたを求めています言ったように。 2001年にLINQの前に書かれたこのコードは、ストアドプロシージャやその他の技術と同様に良いものですが、一般的には良いプラクティスの観点からOKですか?

ない場合、あなたはそれを改善しているだろうか(何のLINQを覚えていない、これは2001です)。

+1

StackOverflowのは、この質問のために良いかもしれないように見えます。また、あなたはかなり恐ろしいデータベース設計の決定に取り組んでいるようです。 –

+2

それは1つの事のためのSQLインジェクション悪用でいっぱいです –

+0

@ジャロッド・ロバソン - 訂正してくれてありがとう。私は、 "コンパイルされたSQL"は単にコードでコンパイルされたSQLだと思った。どうやらそれはそうではありません。 –

答えて

4

ポイント:

動的SQLは、通常の文の変更のセマンティクスは、いくつかの外部要因に基づいていることを意味するものと解釈されます。言い換えると、列名や基本表さえも変更される可能性があります。これは、昔のピボットクエリでは一般的でした。

それは私がこれらのひどく、名前のsqlStringXパラメータに何が起こっているのかわからないので伝えるのは難しいのようなものだが、私は私がここで見ていることは本当にだらけであることを起こるちょうどインラインSQLであることを考えるSQL injectionの脆弱性があります。簡単にparameterizeに簡単です。これをできるだけ早く修正してください。インラインSQLは問題ありませんが、パラメータの代わりに生の文字列を使用する理由はありません。

1

ストアドプロシージャは、これらのタイプのクエリをよりうまく処理する方法の1つのアイデアです。格納されたprocはパラメータが渡すものだけを実行することができますが、そのコードを改善するための私の提案であるため、DBAはどのインデックスがクエリの最適化に役立つかを知ることができます。 @Jarrod Roberson氏が指摘しているように、SQLインジェクション攻撃もこの種のコードでは非常に起こりそうです。

PS:私はこの種のコードを1998年に書きましたが、私はこのクラスのコードがどこにあるのか理解していますので、私は大学からの最初の課題の1つであった "Find Customer"起源。明確化の

+0

+1パラメータ化されたクエリは、複数回呼び出された場合に高いパフォーマンスを発揮します。クエリキャッシュは異なる値であっても複数回クエリを利用する。 –

+0

@ Surfer513 - 使用する選択された列とテーブルが変更され続ける場合、キャッシュされることはほとんどありません。これらは、procに動的SQL文を作成するためのパラメータであり、where/havingの条件には含まれません。 – JeffO

+0

私はあなたに同意します。私は、彼がおそらくその同じクエリを複数回使用しているという仮定に基づいてその理論を使用していました。 –

0

自分でストアドプロシージャを使用したいと思います。しかし、どんな場合でも、何を使用しても、パラメータを使用します。彼らはあなたがそれを持っている方法では全く安全ではなく、あなたが言うように、私は見ることを怒らせる。 :-)

ことはここでは役立つかもしれない一つの基準だ(保存されていないprocsのそれ自体が、それでもPARMSを使用しています) http://www.asp.net/data-access/tutorials/using-parameterized-queries-with-the-sqldatasource-vb

関連する問題