Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 具有动态参数的动态SQL_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql server 具有动态参数的动态SQL

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

我正在尝试编写能够接受多达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(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