还不清楚包装程序的目的是什么(审计或调试),这似乎是一个很尴尬的解决方案。如果您解释为什么要执行此操作,那么某人可能会有完全不同的解决方案,并且希望更好。
提案的最大问题是只能将参数作为字符串传递,这意味着您必须处理动态SQL附带的所有转义,数据转换/格式设置和sql注入问题。最好直接调用每个过程,并从调用代码中传递正确键入的参数。
说了这么多,如果您真的想这样做,那么您可以做这样的事情:
create proc dbo.ExecuteProcedure
@ProcedureName sysname,
@Parameters nvarchar(max),
@Debug bit = 0x0,
@Execute bit = 0x1
as
set nocount on
begin
declare @sql nvarchar(max)
set @sql = 'exec ' + quotename(@ProcedureName) + ' ' + @Parameters
if @Debug = 0x1 print @sql
if @Execute = 0x1 exec(@sql)
end
go
exec dbo.ExecuteProcedure 'dbo.someProc', '@p1 = 1, @p2 = ''themhz''s proc''', 0x1, 0x0
您还应该查看一下sp_executesql,它几乎可以完全满足您的要求,但是它也需要具有所有参数数据类型,这在您的方案中是不可能的。