我有这个过程执行参数及其参数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'
有办法做到这一点吗?
答案 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)
在代码中创建一个返回字符串
的函数将函数PassStoredProcedureName(spName as string)作为字符串
返回spName
结束职能
将数据集设置为“存储过程”
选择客户端时,spName将分配给参数。当数据集执行时,它会将参数传递给函数,该函数将spName传递给数据集。
当相同的存储过程不适用于所有客户端时,我使用它来为客户端执行自定义存储过程。
确保规范化别名字段名称,以便对报表的数据检索不会中断。
即使不需要,您的存储过程也应始终具有相同的参数要求。