首页 文章

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

提问于
浏览
82

在SQL Server中使用存储过程执行动态SQL命令的真实优点和缺点是什么?

EXEC (@SQL)

EXEC SP_EXECUTESQL @SQL

5 回答

  • 19

    sp_executesql 更有可能促进查询计划重用 . 使用 sp_executesql 时,将在调用签名中明确标识参数 . 这篇优秀的文章描述了这个process .

    经常引用动态sql的许多方面的参考文献是Erland Sommarskog的必读:“The Curse and Blessings of Dynamic SQL” .

  • 86

    SP_EXECUTESQL的重要一点是,它允许您创建参数化查询,如果您关心SQL注入,这非常好 .

  • -3

    Microsoft的Using sp_executesql文章建议使用 sp_executesql 而不是 execute 语句 .

    因为此存储过程支持参数替换,所以sp_executesql比EXECUTE更通用;并且因为sp_executesql生成更有可能被SQL Server重用的执行计划,所以sp_executesql比EXECUTE更有效 .

    所以,带走: Do not use execute statement . 使用 sp_executesql .

  • 2

    这些天我总是使用sp_executesql,它实际上是EXEC的包装器,它处理参数和变量 .

    但是,在非常大的数据库上调优查询时,请不要忘记OPTION RECOMPILE,特别是在数据跨越多个数据库且使用CONSTRAINT限制索引扫描的情况下 .

    除非您使用OPTION RECOMPILE,否则SQL Server将尝试为您的查询创建“一刀切”的执行计划,并在每次运行时运行完整的索引扫描 .

    这比搜索效率低得多,并且意味着它可能扫描整个索引,这些索引受限于您甚至不查询的范围:@

  • 3
    • 声明变量

    • 通过命令设置它并添加动态部分,比如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)
    

相关问题