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

时间:2012-03-29 10:28:36

标签: sql sql-server sql-server-2008 stored-procedures

我有这个过程执行参数及其参数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'

的字符串

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:5)

你的包装程序的重点是什么(审计?调试?)并不是很清楚,这似乎是一个非常尴尬的解决方案。如果你解释为什么要这样做,有人可能会有一个完全不同的,希望更好的解决方案。

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

答案 1 :(得分:0)

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

    的函数

    将函数PassStoredProcedureName(spName as string)作为字符串

    返回spName

    结束职能

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

  6. 打开数据集表达式窗口
  7. 输入= Code.PassStoredProcedureName(参数!spName.value)
  8. 选择客户端时,spName将分配给参数。当数据集执行时,它会将参数传递给函数,该函数将spName传递给数据集。

    当相同的存储过程不适用于所有客户端时,我使用它来为客户端执行自定义存储过程。

    确保规范化别名字段名称,以便对报表的数据检索不会中断。

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