2

多値の文字列と整数のパラメーターをデータ テーブルに変換し、それをストアド プロシージャに渡す必要がある場所から SSRS レポートを生成する必要があります。ストアド プロシージャには、複数のテーブル型パラメーターが含まれています。以前に使用varchar(8000)しましたが、データ型の制限も超えていました。次に、データテーブルの概念を導入することを考えました。しかし、SSRS から値を渡す方法がわかりませんでした。

Using Table-Valued Parameters With SQL Server Reporting Servicesに関する GruffCode の解決策を見つけました。

このソリューションで問題が解決し、レポートを生成できるようになりました。ただし、SSRS が次の 2 つのエラーを返す場合があります。

レポートの処理中にエラーが発生しました。
データセット 'DSOutput' のクエリの実行に失敗しました。
文字列型やバイナリは省略されます。ステートメントは終了されました。

レポート処理で予期しないエラーが発生しました。
タイプ 'System.OutOfMemoryException' の例外がスローされました。

いつ、どこで問題が発生しているのかわかりません。

4

2 に答える 2

2

そのブログ投稿で概説されているアプローチは、選択したすべてのパラメーター値をテーブル値パラメーター インスタンスに読み込むために、メモリ内に巨大な文字列を構築することに依存しています。非常に多数の値を選択してクエリに渡す場合、パラメーターをロードする挿入ステートメントを含む文字列を作成しようとしているときに、「System.OutOfMemoryException」が発生する可能性があることがわかりました。

「string or binary data would be truncated」エラーについては、レポートがデータを収集するために使用しているクエリまたはストアド プロシージャ内で発生しているように聞こえます。その t-sql がどのように見えるかを見なければ、なぜそれが起こっているのかはわかりませんが、非常に多数のパラメーター値を選択することにも何らかの形で関連していると思います.

残念ながら、より少ないパラメーター値を選択する方法を見つけることができるかどうかを確認する以外に、これに対する回避策があるかどうかはわかりません。大まかなアイデアをいくつか示します。

  1. ユーザーが少数のパラメーター値またはすべてのパラメーター値を選択する可能性がある場合は、レポートにすべての値をパラメータ。
  2. パラメータ値を少し「ズームアウト」し、それに適している場合は何らかの形でグループ化することも検討できます。そうすれば、ユーザーは、ロールアップされた個々の値のグループを表す少数のパラメーター値から選択できます。
于 2013-03-12T14:03:56.410 に答える
0

私は、あなたが参照した記事のように、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

このアプローチは、ユーザーが入力したコンマ区切りの項目の文字列の処理にも適しています。

于 2015-06-26T22:31:16.173 に答える