我有一个执行另一个由参数及其参数datefrom和传递的过程的过程dateto。
datefrom
dateto
CREATE procedure [dbo].[execute_proc] @procs varchar(200), @pdatefrom date, @pdateto date as exec @procs @datefrom=@pdatefrom,@dateto=@pdateto
但是我还需要动态传递参数,而无需在过程中对其进行编辑。例如,我在想像这样的事情
CREATE procedure [dbo].[execute_proc] @procs varchar(200), @params varchar(max) as exec @procs @params
@params像这样的字符串在哪里@param1=1,@param2='somethingelse'
@params
@param1=1,@param2='somethingelse'
有没有办法做到这一点?
还不清楚包装程序的目的是什么(审计或调试),这似乎是一个很尴尬的解决方案。如果您解释为什么要执行此操作,那么某人可能会有完全不同的解决方案,并且希望更好。
提案的最大问题是只能将参数作为字符串传递,这意味着您必须处理动态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,它几乎可以完全满足您的要求,但是它也需要具有所有参数数据类型,这在您的方案中是不可能的。