Sql server 具有动态参数的动态SQL
我正在尝试编写能够接受多达50个参数的动态SQL。它可以是1、10或15。主存储过程的限制为50,但未定义动态sql的输入 我通过while循环创建了这个动态语句。它将读取表中的参数数(本例中为3),并生成下面的语句。我不关心while循环的性能,因为表/输入非常小:Sql server 具有动态参数的动态SQL,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我正在尝试编写能够接受多达50个参数的动态SQL。它可以是1、10或15。主存储过程的限制为50,但未定义动态sql的输入 我通过while循环创建了这个动态语句。它将读取表中的参数数(本例中为3),并生成下面的语句。我不关心while循环的性能,因为表/输入非常小: --generated from while loop DECLARE @rParam1 NVARCHAR(MAX) DECLARE @rParam2 NVARCHAR(MAX) DECLARE @rParam3 NVARCHAR
--generated from while loop
DECLARE @rParam1 NVARCHAR(MAX)
DECLARE @rParam2 NVARCHAR(MAX)
DECLARE @rParam3 NVARCHAR(MAX)
SELECT @rParam1= Parameter_Name FROM [Template_Params] WHERE Key=12345 AND Sort_Order=1
SELECT @rParam2= Parameter_Name FROM [Template_Params] WHERE Key=12345 AND Sort_Order=2
SELECT @rParam3= Parameter_Name FROM [Template_Params] WHERE Key=12345 AND Sort_Order=3
DECLARE @BODY NVARCHAR(MAX);
SELECT @BODY = Body FROM [Template] WHERE Key=12345
SET @Body = REPLACE(@Body,@rparam1,@PARAM_Input1)
SET @Body = REPLACE(@Body,@rparam2,@PARAM_Input2)
SET @Body = REPLACE(@Body,@rparam3,@PARAM_Input3)
SELECT @BODY
到目前为止,效果良好
存储过程可以有50个输入,但例如,我将限制为5个(仅使用3个)
现在我需要将这些值输入到动态SQL中,这样我的最终动态语句应该
SET @Body = REPLACE(@Body,@rparam1,'test')
SET @Body = REPLACE(@Body,@rparam2,'test1')
SET @Body = REPLACE(@Body,@rparam3,'test2')
这就是我被卡住的地方,我不想像这样写替换语句50次
SET@SQL=REPLACE(@SQL、@PARAM\u Input1、'''''''+@PARAM\u Input1+''')
我尝试使用游标,但变量的名称必须是动态的,并且它不在同一范围内,因此存储过程中的值不会被传递。在SQL中可能无法实现您想要的操作。解决方案可能是,如果您可以发送一个表作为参数,以包含以下信息(或通过友好方式生成):
ParameterName | Value
<value of @rParam1> | <value of @Param_Input1>
<value of @rParam2> | <value of @PARAM_Input2>
我不知道如何获取@PARAM\u InputX
的值,但对于“@rParamX”,可以执行以下操作:
INSERT INTO @Table
SELECT Parameter_Name AS ParameterName, null AS Value
[Template_Params] WHERE Key=12345
ORDER BY sort_order
然后相应地更新行。在
@Table
上,您可以打开一个光标,将当前行与@PARAM\u InputX
相匹配,看起来很诱人。这些都是您尝试执行的操作的很好的参考资料:-您是否考虑过使用@variable表而不是将50个单独的值传递到SP中。它可能是l这样就可以避免混乱,并允许您使用类似递归CTE的结构构建动态代码。
SELECT @BODY = Body FROM [Template] WHERE Key=12345
UPDATE <TableParameter_Or_Variable>
SET @Body = REPLACE(@Body, ParameterName, Value)
INSERT INTO @Table
SELECT Parameter_Name AS ParameterName, null AS Value
[Template_Params] WHERE Key=12345
ORDER BY sort_order