动态SQL - EXEC(@SQL)与EXEC SP_EXECUTESQL(@SQL)

时间:2009-02-13 23:25:40

标签: sql sql-server dynamic

使用

在SQL Server中的存储过程中执行动态SQL命令的现实利弊是什么
EXEC (@SQL)

EXEC SP_EXECUTESQL @SQL

5 个答案:

答案 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)

  1. 声明变量
  2. 通过命令设置它并添加动态部分,例如sp的使用参数值(这里是@IsMonday和@IsTuesday是sp params)
  3. 执行命令

    declare  @sql varchar (100)
    set @sql ='select * from #td1'
    
    if (@IsMonday+@IsTuesday !='')
    begin
    set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )'
    end
    exec( @sql)