小编典典

将动态参数传递给SQL Server 2008中的存储过程

sql

我有一个执行另一个由参数及其参数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'

有没有办法做到这一点?


阅读 172

收藏
2021-04-07

共1个答案

小编典典

还不清楚包装程序的目的是什么(审计或调试),这似乎是一个很尴尬的解决方案。如果您解释为什么要执行此操作,那么某人可能会有完全不同的解决方案,并且希望更好。

提案的最大问题是只能将参数作为字符串传递,这意味着您必须处理动态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,它几乎可以完全满足您的要求,但是它也需要具有所有参数数据类型,这在您的方案中是不可能的。

2021-04-07