鉴于:
CREATE PROCEDURE [dbo].[my_storedproc]
@param1 int, @param2 varchar(100)
AS
<<whatever>>
GO
这些不同的执行方法之间是否存在已知的性能差异?:
-- Method #1:
declare @param1 int = 1
declare @param2 varchar(100) = 'hello'
exec my_storedproc @param1, @param2
-- Method #2:
exec my_storedproc @param1=1, @param2='hello'
-- Method #3:
declare @param1 int = 1
declare @param2 varchar(100) = 'hello'
declare @procname nvarchar(100) = N'my_storedproc @param1, @param2'
declare @params nvarchar(4000) = N'@param1 int, @param2 varchar(100)'
exec sp_executesql @procname, @params, @param1, @param2
-- Method #4:
declare @procname nvarchar(4000) = N'my_storedproc @param1=1, @param2=''hello'''
exec sp_executesql @procname
-- Method #5:
declare @procname nvarchar(4000) = N'my_storedproc 1, ''hello'''
exec sp_executesql @procname
-- Method #6:
declare @procname nvarchar(4000) = N'my_storedproc 1, ''hello'''
exec (@procname)
“你为什么要问?” 你问?我试图找到一种方法来完全基于元数据执行存储过程,控制存储过程将物理执行所有其他配置的(在元数据中)存储过程,除了元数据中定义的内容外,对它们一无所知。在这个控制器 SP 中,我无法(在任何实际意义上)知道并声明每个可能必须调用的存储过程所需的特定物理参数(及其所需的数据类型)——我正在尝试找到一种方法来执行它们完全通用,同时仍希望保持良好的性能(重用查询计划等)。