2017-06-01 3 views
1

Zum Beispiel ist dies in der Regel erlaubt:Welche Teile einer SQL-Abfrage dürfen parametrisiert werden?

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

Aber nicht dies:

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

alle möglichen Kombinationen nicht getestet Nachdem .... Ist dies:

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

Oder diese :

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

Oder ....

Was ist die allgemeine Regel für die Bestimmung, ob ein Teil einer Abfrage parametrisierbar ist, und warum?

(Ich weiß, dass diese unterschiedliche Antworten in Bezug auf verschiedene DB-Motoren und Adapter für verschiedene Sprachen haben kann, aber ich habe bemerkt, dass es allgemeine Trends)

+2

Kurz gesagt hilft, können Sie einen Wert parametrieren aber man kann nicht ein Objekt wie eine Tabelle, eine Spalte oder eine Datenbank parametrieren. Wenn Sie dynamische Spalten und Tabellen benötigen, weist dies im Allgemeinen auf einen schlechten Datenbankentwurf hin (jedoch nicht immer). Sie müssen etwas Code schreiben, um in diesen Fällen Ihr SQL dynamisch zu generieren. – JNevill

+0

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

+1

Kurz gesagt: alles, was den Abfrageplan ** ändert ** nicht, wenn die Parameter geändert werden. Also: Schema/Tabelle/Spaltennamen, Operatoren, (Aggregat) Funktionsnamen können nicht parametrisiert werden (und würde dynamische SQL benötigen) Vielleicht habe ich ein paar vergessen ... – wildplasser

Antwort

3

Identifiers und Schlüsselwörter sind nicht parametrierbar. Dazu gehören:

  • Spalten Namen
  • Tabellennamen
  • Schema Namen
  • Datenbanknamen
  • Operatoren
  • Funktionsnamen
  • Keywords

Die Grundidee ist, dass die Abfrage wird kompiliert und die kompilierte Version hat Parameter. Die Abfrage kann nicht kompiliert werden, wenn eines der obigen Elemente fehlt.

0

Sie können alles in einer Abfrage parametrisieren, aber nicht zur Laufzeit. Wenn Sie so ein: @sql = 'wählen '+ @column +' von '+ @table +''

EXEC (@sql)

können Sie parametrieren alles

Sie also müssen zuerst die SQL-Anweisung erstellen und danach ausführen. So mache ich es normalerweise.

Hoffnung, die

Verwandte Themen