在SQL Server中使用存储过程执行动态SQL命令的真实优点和缺点是什么?
EXEC (@SQL)
与
EXEC SP_EXECUTESQL @SQL
?
sp_executesql 更有可能促进查询计划重用 . 使用 sp_executesql 时,将在调用签名中明确标识参数 . 这篇优秀的文章描述了这个process .
sp_executesql
经常引用动态sql的许多方面的参考文献是Erland Sommarskog的必读:“The Curse and Blessings of Dynamic SQL” .
SP_EXECUTESQL的重要一点是,它允许您创建参数化查询,如果您关心SQL注入,这非常好 .
Microsoft的Using sp_executesql文章建议使用 sp_executesql 而不是 execute 语句 .
execute
因为此存储过程支持参数替换,所以sp_executesql比EXECUTE更通用;并且因为sp_executesql生成更有可能被SQL Server重用的执行计划,所以sp_executesql比EXECUTE更有效 .
所以,带走: Do not use execute statement . 使用 sp_executesql .
这些天我总是使用sp_executesql,它实际上是EXEC的包装器,它处理参数和变量 .
但是,在非常大的数据库上调优查询时,请不要忘记OPTION RECOMPILE,特别是在数据跨越多个数据库且使用CONSTRAINT限制索引扫描的情况下 .
除非您使用OPTION RECOMPILE,否则SQL Server将尝试为您的查询创建“一刀切”的执行计划,并在每次运行时运行完整的索引扫描 .
这比搜索效率低得多,并且意味着它可能扫描整个索引,这些索引受限于您甚至不查询的范围:@
声明变量
通过命令设置它并添加动态部分,比如sp的使用参数值(这里@IsMonday和@IsTuesday是sp params)
执行命令
declare @sql varchar (100) set @sql ='select * from #td1' if (@IsMonday+@IsTuesday !='') begin set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )' end exec( @sql)
5 回答
sp_executesql
更有可能促进查询计划重用 . 使用sp_executesql
时,将在调用签名中明确标识参数 . 这篇优秀的文章描述了这个process .经常引用动态sql的许多方面的参考文献是Erland Sommarskog的必读:“The Curse and Blessings of Dynamic SQL” .
SP_EXECUTESQL的重要一点是,它允许您创建参数化查询,如果您关心SQL注入,这非常好 .
Microsoft的Using sp_executesql文章建议使用
sp_executesql
而不是execute
语句 .所以,带走: Do not use execute statement . 使用
sp_executesql
.这些天我总是使用sp_executesql,它实际上是EXEC的包装器,它处理参数和变量 .
但是,在非常大的数据库上调优查询时,请不要忘记OPTION RECOMPILE,特别是在数据跨越多个数据库且使用CONSTRAINT限制索引扫描的情况下 .
除非您使用OPTION RECOMPILE,否则SQL Server将尝试为您的查询创建“一刀切”的执行计划,并在每次运行时运行完整的索引扫描 .
这比搜索效率低得多,并且意味着它可能扫描整个索引,这些索引受限于您甚至不查询的范围:@
声明变量
通过命令设置它并添加动态部分,比如sp的使用参数值(这里@IsMonday和@IsTuesday是sp params)
执行命令