0

いくつかのパラメーターを含む Report Builder 3.0 レポートがあります。具体的には、アカウント番号 (データベースでは char(12) として定義されています)。データベースはベンダー提供のデータベースであるため、データベース スキーマを制御することはできません。

私の質問は、アカウント ID に自由形式のパラメーターがある場合、SQL データベースに送信されるクエリにどのように変換されるのかということです。

これらの自由形式のフィールドを処理する方法は、ユーザー定義関数を使用することです。

Public Function ConvertStringtoArray(sourceString as String) As string()
    Dim arrayOfStrings() As String
    Dim emptyString as String = " "
    If String.IsNullOrEmpty(sourceString) Then
    arrayOfStrings = emptyString.Split(",")
    Else
    arrayOfStrings = sourceString.Replace(" ", "").Split(",")
    End If
    return arrayOfStrings
End Function

パラメータは次のように定義されます: @AcctList = code.ConvertStringToArray(Parameters!AcctList.Value)

SQL クエリの where 句には次のようなものがあります: Ac.Account_ID In (@AcctList)

私の質問は、In 句をどのように構築するかです。それは文字通り次のようなものでしょうか: Where Ac.Account_ID In (N'Acct1',N'Acct2').

私はそれが重要だと思う理由は、SSMS でクエリを実行しているときに、where 句に Where Ac.Account_ID In ('TGIF') がある場合、1 秒未満で実行されるためです。 Where Ac.Account_ID In (N'TGIF') がある場合、13 秒以上かかります。返されるデータセットの合計は、わずか 917 行です。

クエリしているデータベースは 2008 R2 SP2 で、互換性は SQL 2008 に設定されています。

4

1 に答える 1

1

「(@parameter) のどこにある」という述語が実際には「('value1'、'value2' など) にある」という述語について、あなたの仮定は正しいです。@parameter が複数の値を許可する場合。ただし、コードを使用するだけでなく、パラメーターをクエリに関連付けることもできます。値がパラメーターの選択に必要な値のテーブルになる単純な「値から値を選択」のように、メインのデータセット以外のデータセットを持つことができます。文字列を分割する必要がない限り、これは多くの場合、はるかに効率的です。

于 2013-08-09T21:51:16.120 に答える