2017-06-01 4 views
1

が、これは一般的に許可されている:SQLクエリのどの部分をパラメータ化することができますか?例えば

sql.execute("select * from some_table where [email protected]", parameter=5); 

ではなく、この:

sql.execute("select * from @which_table where some_column=5", which_table="some_table"); 

は、すべての可能な組み合わせをテストしていないた....です:

sql.execute("select @which_column from some_table", which_column="some_column"); 

またはこの:

sql.execute("select some_column*@multiplier from some_table", multipler=5); 

または...

クエリの一部がパラメータ化可能かどうかを判断する一般的なルールは何ですか?また、その理由は何ですか?

(私はこれは、異なる言語の異なるDBエンジンとアダプタに対して異なる答えを持っているかもしれないが、私は一般的な傾向があることに気づいたことを実現)

+2

を助け

希望は、あなたが値をパラメータ化できますが、テーブル、列、またはデータベースのようなオブジェクトをパラメータ化することはできません。動的な列と表が必要な場合は、通常、悪いデータベース設計を指します(必ずしもそうではありません)。そのような場合には、SQLを動的に生成するためのコードを記述する必要があります。 – JNevill

+0

Oracle:https://oracle-base.com/articles/misc/literals-substitution-variables-and-bind-variables – xQbert

+1

要するに、パラメータが変更されたときにクエリプランを変更しない**すべて**です。だから:スキーマ/テーブル/列名、演算子、(集約)関数名はパラメータ化することはできません(そして、動的SQLが必要)おそらく私はいくつかを忘れた... – wildplasser

答えて

3

識別子とキーワードは、パラメータ化されません。これには含まれています:

  • 列名
  • 表名
  • スキーマ名
  • データベース名
  • 演算子
  • キーワード

基本的な考え方は、ということである関数名をクエリコンパイルされたバージョンにはパラメータがあります。上記の要素のいずれかが見つからない場合、クエリはコンパイルできません。

0

クエリではパラメータ化可能ですが、実行時には何もできません。あなたはこのように設定した場合: @sql =

だからを+ @column + 'から '+ @table +' '

EXEC(@sql)

あなたはパラメータ化することができ、すべてを' 選択'最初にSQL文を作成し、その後にSQL文を実行する必要があります。それが私が通常やる方法です。要するに

関連する問題