sql >> データベース >  >> RDS >> Sqlserver

SSRSの複数の値パラメーターをストアドプロシージャに渡す

    そうですね、最初に背景を説明する必要があります。

    SSRS パラメータで複数の値を選択できるようにすると、複数の値を選択すると、コンマで区切られた値の文字列が 1 つの文字列として作成されます

      'value1,value2,value3'
    

    IN を使用して文字列の値をチェックするには 演算子には、次のようなコンマで連結された文字列が必要です ....

      'value1','value2','value3'
    

    あなたの手続き

    proc で値を明示的に挿入すると、テーブルに複数の値が挿入されます。

      INSERT INTO Table_Value_Param
      VALUES ('value1'),       --<-- 1st value/Row
             ('value2'),       --<-- 2nd Value/Row
             ('value3')        --<-- 3rd Value/Row
    

    これにより、プロシージャ内で

    のようなステートメントを実行した場合と同様に、期待される結果が返されます。
    SELECT * 
    FROM Table_Name
    WHERE ColumnName IN (SELECT ColumnName 
                         FROM Table_Value_Param)
    

    一方、SSRS レポート パラメータを使用してテーブルに挿入しようとすると、テーブルは

    のような値を挿入します。
      INSERT INTO Table_Value_Param
      VALUES ('value1,value2,value3')   --<-- One Row/Value containing all the values comma separated
    

    解決策

    TVP の作成 この状況では本当に役に立ちません。私がしているのは dbo.Split() を利用することです

    オンラインで分割関数の多くの定義を見つけることができます。いくつかのクールなものについては、こちらをご覧ください Split Function equivalent in tsql?

    この分割関数を作成したら、プロシージャ定義内でこの関数を使用するだけで、テーブル値パラメーターは必要ありません。

    このようなもの...

      SELECT * 
      FROM Table_Name 
      WHERE ColumnName IN ( 
                           SELECT Value
                           FROM dbo.Split(@Report_Param, ',')
                           ) 
    


    1. 単一クエリMySQLでのINSERTとSELECT

    2. SQL Server MERGEステートメントのユースケース:オンラインテーブルと履歴テーブルの同期

    3. Grails 2.4.4 DataSource create-dropは、FKを持つすべてのテーブルを削除できません

    4. アプリケーション、接続プール、PostgreSQL用の1つのセキュリティシステム-LDAPの場合