gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:48:36 25 4
gpt4 key购买 nike

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

有没有办法做到这一点?

最佳答案

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

您提案的最大问题是您只能将参数作为字符串传递,这意味着您必须处理所有转义、数据转换/格式化和 SQL 注入(inject)问题,这些问题与 dynamic 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 ,它几乎完全符合您的要求,但它也需要具有所有参数数据类型,您说这在您的场景中是不可能的。

关于sql - 将动态参数传递给 SQL Server 2008 中的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9923567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com