动态SQL与动态参数

时间:2017-02-26 07:07:34

标签: sql-server sql-server-2012

我正在尝试编写可以接受多达50个参数的动态SQL。它可以是1或10或15.主sproc的限制是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个)

--this is from the main sproc 
DECLARE @PARAM_Input1 NVARCHAR(MAX)='test',
@PARAM_Input2 NVARCHAR(MAX)='test1',
@PARAM_Input3 NVARCHAR(MAX)='test2',
@PARAM_Input4 NVARCHAR(MAX),
@PARAM_Input5 NVARCHAR(MAX),
@param_input6 nvarchar(max)

现在我需要将这些值放入动态SQL中,这样我的最终Dynamic语句应该有

SET @Body = REPLACE(@Body,@rparam1,'test')
SET @Body = REPLACE(@Body,@rparam2,'test1')
SET @Body = REPLACE(@Body,@rparam3,'test2')

这是我被困的地方,我不想像这样写50次REPLACE声明。

SET @SQL=REPLACE(@SQL,'@PARAM_Input1',''''+@PARAM_Input1+'''')

我尝试了一个游标,但是变量的名称必须是动态的,并且它不在同一个范围内,因此sproc中的值不会被传递。

1 个答案:

答案 0 :(得分:0)

在SQL中可能无法实现您的想法。一个解决方案可能是你可以发送一个表作为参数来包含下面的信息(或者以dinamically的方式生成它:

ParameterName            | Value
<value of @rParam1>      | <value of @Param_Input1>
<value of @rParam2>      | <value of @PARAM_Input2>

然后,更新@BODY变量

SELECT @BODY = Body FROM [Template] WHERE Key=12345
UPDATE <TableParameter_Or_Variable>
SET @Body = REPLACE(@Body, ParameterName, Value)

我不知道你如何获得@PARAM_InputX的值,但是对于`@ rParamX&#39;你可以这样做:

INSERT INTO @Table 
SELECT Parameter_Name AS ParameterName, null AS Value
[Template_Params] WHERE Key=12345
ORDER BY sort_order

然后相应地更新行。在@Table上,您可以打开游标并将当前行与@PARAM_InputX匹配。