与えられた:
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内では、呼び出す必要がある可能性のあるすべてのストアドプロシージャに必要な特定の物理パラメーター(必要なデータ型を含む)を(実際的な意味で)知り、宣言することはできません-それらを実行する方法を見つけようとしています完全に一般的ですが、うまくいけばまともなパフォーマンスを維持します(クエリプランの再利用など)。