Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们认为什么是动态SQL语句? < P> a)我们认为动态SQL语句是什么? 是否有任何sql语句动态地向sql字符串中添加子句,甚至只是子句的一部分_Sql_Dynamic Sql - Fatal编程技术网

我们认为什么是动态SQL语句? < P> a)我们认为动态SQL语句是什么? 是否有任何sql语句动态地向sql字符串中添加子句,甚至只是子句的一部分

我们认为什么是动态SQL语句? < P> a)我们认为动态SQL语句是什么? 是否有任何sql语句动态地向sql字符串中添加子句,甚至只是子句的一部分,sql,dynamic-sql,Sql,Dynamic Sql,b) 那么,为动态提供的值使用占位符的参数化字符串不也被视为动态sql语句吗 thanx动态SQL语句是在执行时生成的语句。重点在于陈述。因此,如果您只是在执行时提供一个值,它就不是动态SQL。当然,任何涉及EXEC(@SQL)或EXEC sp_ExecuteSQL@SQL,…(即数据库本身的动态)的内容都符合条件,但我想您可能会认为任何在运行时生成的SQL(而不是在构建/安装时固定的)都符合条件 因此,是的,您可以认为运行时生成的、但正确参数化的查询是“动态的”(例如,LINQ到SQL生成的查

b) 那么,为动态提供的值使用占位符的参数化字符串不也被视为动态sql语句吗


thanx

动态SQL语句是在执行时生成的语句。重点在于陈述。因此,如果您只是在执行时提供一个值,它就不是动态SQL。

当然,任何涉及
EXEC(@SQL)
EXEC sp_ExecuteSQL@SQL,…
(即数据库本身的动态)的内容都符合条件,但我想您可能会认为任何在运行时生成的SQL(而不是在构建/安装时固定的)都符合条件


因此,是的,您可以认为运行时生成的、但正确参数化的查询是“动态的”(例如,LINQ到SQL生成的查询),但老实说,只要它不让您受到注入攻击,我就不在乎名称-p

A.任何会导致DB服务器将字符串作为SQL进行计算的操作


B.不,因为它们仍然通过DB驱动程序/提供程序进行清理。

动态SQL语句通常指那些使用字符串连接构造的语句

"SELECT name FROM names WHERE id=" + this.id;
"SELECT name FROM names WHERE id=" + this.id + " AND age=" this.age;
参数化查询也是动态的,但不是在构造方面。您只能更改参数,但不能更改语句的结构,即添加
WHERE
子句

参数化查询通常在数据库级别,因此数据库可以缓存查询的执行计划并反复使用它。在第一种情况下不太可能,因为文本或where子句的顺序的简单更改可能会导致数据库无法识别以前缓存的执行计划并重新开始


第一个构造也容易受到SQL注入的攻击,因为很难验证尝试注入恶意SQL的输入值。

对于b点)您已经知道该语句,并传入已知参数(希望是键入安全的,而不是字符串文本)

动态sql基本上就是在运行时之前未完全构造的任何sql。它是通过将运行时值连接到语句中动态生成的。可以是sql语句的任何一部分

我明白你的意思,但是有一个比较客观的标准,它将特定情况定义为动态sql,而不是说准备好的语句是

动态语句导致SQL server完全评估查询、定义查询计划等这一事实。

使用预先准备好的语句,SQL可以(除非明确要求)缓存查询计划(在某些情况下,甚至可以收集有关返回的统计信息等)。
[Edit:实际上,即使是动态SQL语句也会被缓存,但这种缓存的计划被重用的机会要小得多,因为要实现这一点,需要重新接收完全相同的查询(与参数化查询不同,在参数化查询中,即使使用不同的参数值,也会重用计划,当然,除非“带重新编译”)]

因此,在问题的例子中,a)和b)都将被视为动态SQL,因为在b)的例子中,替换发生在SQL之外。这不是一个准备好的语句。SQL将它视为一个全新的语句,因为它不知道您只是在更改搜索值

现在……除了以SQL为中心的动态SQL定义之外,区分各种形式的动态SQL可能很有用,比如说您的a)和b)案例。
动态SQL有一段时间的坏名声,其中一些与SQL注入感知有关。我见过一些应用程序,其中动态SQL是生成和执行的,在存储过程中,由于它在技术上是“SQL端”,一些人倾向于接受它(即使SQL注入可能没有得到特别的解决)…

我想在这里指出的一点是,通常需要从各种上下文元素动态地构建查询,最好在“应用程序”层中实现这一点(称之为应用程序端层,因为实际上,它可以而且应该与应用程序本身分离),其中编程语言和相关的数据结构通常比T-SQL等更容易表达。因此,为了称其为“数据端”,将其插入SQL“在我看来,这不是一件好事。

< P>我认为动态SQL语句是一个在运行时接受新值以便返回不同结果的语句。据我估计,“新值”可以是不同的排序依据、新的WHERE标准、不同的字段选择等

< P> a)我们认为什么是动态SQL语句? 是否有任何sql语句动态地向sql字符串中添加子句,甚至只是子句的一部分

两者-执行前更改/定制的任何查询

b) 那么,为动态提供的值使用占位符的参数化字符串不也被视为动态sql语句吗

参数化查询(也称为使用绑定变量)为查询提供不同的筛选条件。您可以使用
(my_变量为NULL或…
,但在任何数据库上,OR性能通常都很糟糕&这种方法会破坏可用性


动态SQL通常处理定制查询以包含其他逻辑,如仅在设置特定参数时才需要包含的连接。但是,也有一些限制,如IN子句不支持将逗号分隔的字符串转换为选项列表—为此,您必须使用动态SQL,或以另一种方式(CLR、管道化到临时表等)处理逗号分隔的列表。

根据我的定义,两者都是动态SQL!许多答案似乎主要集中在
SQL注入问题上。而这实际上是一种与th相关的现象