举例来说,这通常是允许的:哪些部分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);
或者....
什么是确定查询的某些部分是参数化,为什么一般规则?
(我知道这可能有不同的答案,相对于不同的数据库引擎,并针对不同的语言适配器,但我注意到,有总的趋势)
总之,可以参数的值,但你不能参数的物体,像表,列或数据库。当你需要动态的列和表时,它通常指向错误的数据库设计(但不总是)。在这种情况下,您必须编写一些代码才能动态生成SQL。 – JNevill
Oracle:https://oracle-base.com/articles/misc/literals-substitution-variables-and-bind-variables – xQbert
简而言之:当参数发生变化时,所有**不会更改查询计划。所以:模式/表/列名称,运算符,(聚合)函数名称不能被参数化(并且需要动态SQL)也许我忘了一些... – wildplasser