私は、あなたが参照した記事のように、SQL ステートメントで Text パラメータと EXEC を使用するのが好きではありません。そうすると、SQL インジェクションの対象になると説明されています。複数値パラメーターを使用した既定の SSRS の動作では、クエリが SQL サーバーに送信されるときに、パラメーターの代わりに値のコンマ区切りリストが直接置き換えられます。これは単純な IN クエリではうまく機能しますが、他の場所では望ましくない場合があります。この動作は、DataSet のパラメータ値を の式に設定することで回避できます=Join(Parameters!CustomerIDs.Value, ", ")
。これが完了したら、次の SQL を使用してロードされたテーブル変数を取得できます。
DECLARE @CustomerIDsTable TABLE (CustomerID int NOT NULL PRIMARY KEY)
INSERT INTO @CustomerIDsTable (CustomerID)
SELECT DISTINCT TextNodes.Node.value(N'.', N'int') AS CustomerID
FROM (
SELECT CONVERT(XML, N'<A>' + COALESCE(N'<e>' + REPLACE(@CustomerIDs, N',', N'</e><e>') + N'</e>', '') + N'</A>') AS pNode
) AS xmlDocs
CROSS APPLY pNode.nodes(N'/A/e') AS TextNodes(Node)
-- Do whatever with the resulting table variable, i.e.,
EXEC rpt_CustomerTransactionSummary @StartDate, @EndDate, @CustomerIDsTable
整数の代わりにテキストを使用すると、数行が次のように変更されます。
DECLARE @CustomerIDsTable TABLE (CustomerID nvarchar(MAX) NOT NULL PRIMARY KEY)
INSERT INTO @CustomerIDsTable (CustomerID)
SELECT DISTINCT TextNodes.Node.value(N'.', N'nvarchar(MAX)') AS CustomerID
FROM (
SELECT CONVERT(XML, N'<A>' + COALESCE(N'<e>' + REPLACE(@CustomerIDs, N',', N'</e><e>') + N'</e>', '') + N'</A>') AS pNode
) AS xmlDocs
CROSS APPLY pNode.nodes(N'/A/e') AS TextNodes(Node)
-- Do whatever with the resulting table variable, i.e.,
EXEC rpt_CustomerTransactionSummary @StartDate, @EndDate, @CustomerIDsTable
このアプローチは、ユーザーが入力したコンマ区切りの項目の文字列の処理にも適しています。