2017-02-26 16 views
0

最大50個のパラメータを受け入れることができる動的SQLを作成しようとしています。 1または10または15にすることができます。上限はsprocのメインスクリプトから50ですが、動的SQLへの入力は定義されていません。動的パラメータを使用した動的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にこれらの値を取得する必要があります
SET @Body = REPLACE(@Body,@rparam1,'test') 
SET @Body = REPLACE(@Body,@rparam2,'test1') 
SET @Body = REPLACE(@Body,@rparam3,'test2') 

これは私が立ち往生している場所です。このようにREPLACEステートメントを50回書くのは嫌です。

SET @SQL=REPLACE(@SQL,'@PARAM_Input1',''''[email protected]_Input1+'''')

Iカーソルを試みたが、変数の名前は、動的であることがあり、SPROCからの値が渡されていないので、同じスコープ内ではありません。

+0

[sql injection](http://bobby-tables.com/)を招待しているようです。これらは、あなたがしようとしているものの良い参考資料です:[動的検索条件 - Erland Sommarskog](http://www.sommarskog.se/dyn-search.html) - [Catch-all queries - Gail Shaw] ://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/) – SqlZim

+0

SPに50個の別々の値を渡すのではなく、@variableテーブルを使うことを考えましたか?それほど面倒ではなく、再帰的CTEのような構造で動的コードを構築することができます。 – pacreely

答えて

0

SQLでは、あなたが気にしていることを実行できないことがあります。 、そして、

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) 

を更新:ソリューションを使用すると、以下のような情報が含まれている(またはdinamicallyそれを生成するためのパラメータとして、テーブルを送ることができれば可能性があり@PARAM_InputXの値を取得しますが、 `@rParamX」のあなたのような何かを行うことができます:で

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

をし、それに応じて行を更新します。カーソルを開き、現在の行を@PARAM_InputXに一致させることができます。

関連する問題