在SQL Server 2008中向存储过程传递动态参数

3

我有一个程序,它执行通过参数传递的另一个程序和它的参数datefromdateto

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'

有没有方法实现这个功能?


请访问此链接:http://www.sqlteam.com/article/stored-procedures-parameters-inserts-and-updates - Vishal Suthar
是的,我不知道每次将传递哪些参数给存储过程,因此它将每次生成执行。 - themhz
1
你说的“每次生成执行”是什么意思?如果参数可以是任何东西,而且你事先不知道它们是什么,那么你怎么能使用它们编写任何代码呢? - Pondlife
实际代码依赖于每次执行的过程。这个过程的唯一作用是执行另一个过程,传递它的参数,而不知道有多少参数或什么数据类型。 - themhz
1
从安全角度来看,这是一个坏主意 - 你基本上提供了一个代理来在 SQL 服务器上执行任何东西。 - Steve Mayne
显示剩余3条评论
2个回答

6
你的包装过程的目的不是很清楚(审计?调试?),而且看起来是一个非常笨拙的解决方案。如果你解释一下为什么要这样做,可能会有完全不同且更好的解决方案。
你提出的最大问题是你只能将参数作为字符串传递,这意味着你必须处理所有转义、数据转换/格式化和 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,它几乎可以做到你想要的,但是它也需要所有参数数据类型,而你说在你的情况下这是不可能的。

好的,谢谢您的时间。这是旧的方法,我接受您的答案,因为似乎还没有其他方法,而您提出的方法是唯一的方法,尽管存在安全问题。 - themhz

0
  1. 将存储过程名称放入客户表的varchar字段中。
  2. 选择客户时,检索SP名称并将其分配给参数(spName)。
  3. 在代码中创建一个返回字符串的函数

    function PassStoredProcedureName(spName as string) as string

    return spName

    end function

  4. 将数据集设置为“存储过程”

  5. 打开数据集表达式窗口
  6. 输入=Code.PassStoredProcedureName(Parameters!spName.value)

当您选择客户时,spName将被分配给参数。当数据集执行时,它将传递参数到函数,该函数将将spName传递给数据集。

我使用这个方法来为客户执行自定义存储过程,因为同一个存储过程不适用于所有客户。

请确保规范化别名字段名称,以便数据检索到报告时不会出错。

即使不需要,您的存储过程也应始终具有相同的参数要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接