我正在测试一个存储过程,看看SQL Server是否可以制定一个"缓存计划"为了它。 在这个存储过程中,它包含"动态sql"语法(使用" EXEC"),并假设sql server不会存储缓存计划。 我使用ADO.NET来调用这个存储过程,并在sql server中找到了结果。
下面的图片展示了我在" sys.dm_exec_cached_plans"中搜索的结果。执行存储过程后的表。
这是否意味着正在为任何类似的搜索缓存此存储过程? 为什么没有" query_plan"结果中的值?
sql server是SQL 2014 Enterprise Edition。 谢谢。
答案 0 :(得分:2)
如果希望动态sql重用缓存的执行计划,请使用sp_executesql
,如果您阅读了sp_executesql的MSDN文档,则会明确指出sp_executesql可以重用执行计划而Exec / Execute不会。
sp_executesql还允许您参数化查询并保护您免受SQL注入攻击。
要执行字符串,建议您使用sp_executesql 存储过程而不是EXECUTE语句。因为这个存储 procedure支持参数替换,sp_executesql更多 比EXECUTE多才多艺;并且因为sp_executesql生成执行 计划更可能被SQL Server重用,sp_executesql 比EXECUTE更有效。