我正在尝试编写可以接受多达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中的值不会被传递。
答案 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
匹配。