请教存储过程执行的问题
以下4种执行存储过程的区别是什么?
我实际测试了,貌似没什么区别,执行计划都能复用.
SQL code
① exec [sp_name] [parameter]
② exec sp_executesql N'exec [sp_name] [parameter]',
N'[parameter define]',
N'[parameter value]'
③ declare @sql varchar(6000)
select @sql='exec [sp_name] [parameter]'
exec(@sql)
④ declare @p int
exec sp_prepexec @p output,
N'[parameter define]',
N'exec [sp_name] [parameter]',
[parameter]=[value]
exec sp_execute @p, [parameter]=[value]
------解决方案--------------------
------解决方案-------------------- 我忘记在哪本书看过,exec是每次都要编译,而sp_execute 是不需要每次编译的。其他我就不清楚了
------解决方案-------------------- 通常,sp_executesql则更具有优势,它 提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能(对于这个我在 后面的例子中会详加说明),还可以编写更安全的代码。EXEC在某些情况下会更灵活。除非您有令人信服的理由使用EXEC,否侧尽量使用 sp_executesql.
------解决方案-------------------- 探讨 通常,sp_executesql则更具有优势,它 提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能(对于这个我在 后面的例子中会详加说明),还可以编写更安全的代码。EXEC在某些情况下会更灵活。除非您有令人信服的理由使用EXEC,否侧尽量使用 sp_executesql.
------解决方案--------------------
SQL code
SELECT
cacheobjtype,objtype,usecounts,sql
FROM
sys.syscacheobjects
WHERE
sql NOT LIKE '%cache%'
AND
sql NOT LIKE '%sys.%'
AND
sql NOT LIKE '%sp_executesql%'