最大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からの値が渡されていないので、同じスコープ内ではありません。
[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
SPに50個の別々の値を渡すのではなく、@variableテーブルを使うことを考えましたか?それほど面倒ではなく、再帰的CTEのような構造で動的コードを構築することができます。 – pacreely