2017-06-01 71 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); 

或者....

什么是确定查询的某些部分是参数化,为什么一般规则?

(我知道这可能有不同的答案,相对于不同的数据库引擎,并针对不同的语言适配器,但我注意到,有总的趋势)

+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语句,然后执行它。这是我通常这样做的方式。

希望帮助