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