当前位置: 首页 > 面试题库 >

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

谷梁英资
2023-03-14
问题内容

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

有没有办法做到这一点?


问题答案:

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

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



 类似资料:
  • 问题内容: 相当全面的大脑查询提供了千一百种传递可变长度参数列表的方法,这些方法涉及以下方法: 基于CLR的将字符串解析为整数列表的方法 需要存在“ Numbers”表(wtf?)的表值函数 将数据作为XML传递 我们的要求是将两个可变长度的整数列表(最大20个整数)传递给存储过程。上面概述的所有方法似乎都很有趣。 这仅仅是必须完成的方式,还是有更好的方式? 问题答案: 是的,我一定会为此考虑一下

  • 问题内容: 我正在创建一些存储过程来管理我的数据库。特别是,我想创建一个存储过程来编辑特定行的一列,但是我想通过将列名作为参数传递来做到这一点。 那就是我想做的 使用该参数,我找到了要编辑的特定行,并且我想使用该参数来仅编辑我想要的列。 正如我在其他主题上所读到的那样,我已经尝试使用或定义局部变量,但没有找到解决方案。 有什么帮助吗? 问题答案: 您将需要使用 动态SQL : 请注意,正如Paul

  • 我试图通过Oracle光标从python到Oracle存储过程(SP)。要求SP获取数据并将数据插入表中。SP取两个参数p1和p2 p1 以下是存储过程的详细信息: p2sys_refcursor,数据将以串联格式(col1|col2|...) 获取cur.callproc(“LIBRA.pt1,[linestr,result]”行中的“DatabaseError:ORA-01036:非法变量名称

  • 问题内容: 我正在创建下面的存储过程。 在上面,当我动态地传递该子句时,它不能正确地对数据进行排序,但是当我显式地写入列名时,它可以很好地工作。可能是其采取的,而不是 我尝试写作,但是没有用 我如何在这里动态传递订单。 编辑:@Andomar:我尝试了您提供的解决方案,并为Date类型添加了一个字段。而且它也不起作用。 以下是我的工作。 问题答案: 您可以使用一个复杂的子句。每个排序方向和每种数据

  • 问题内容: 我想将 DataDable 传递给 存储过程作为 以下各列的 参数 : 现在,我想在存储过程中使用此数据表,并要在其上声明一个游标。然后使用该光标将值顺序插入数据库表中。 请告诉我如何在存储过程中 声明datatable参数* ,然后在该 参数 上使用 游标 ? * 问题答案: 首先,您需要创建一个类型: 现在,您的存储过程可以将其声明为只读输入参数: 我不确定为什么要在这里使用游标,