70

レポートにいくつかの複数選択パラメーターがあります。Webクエリ文字列の単一のパラメータに複数の値を渡す方法を見つけようとしていますか?単一の値を渡すと、正常に機能します。

レポートは、単一のパラメーターに対して複数の選択肢を選択して正常に実行されます。私の問題はWebクエリ文字列にあります。

4

21 に答える 21

102

John Sansom のソリューションは機能しますが、これを行う別の方法があります。非効率なスカラー値の UDF を使用する必要はありません。SSRS レポートのクエリ定義の [パラメーター] タブで、パラメーター値を

=join(Parameters!<your param name>.Value,",")

クエリでは、次のように値を参照できます。

where yourColumn in (@<your param name>)
于 2009-02-06T08:42:32.313 に答える
47

これは、複数選択パラメーターを別の複数選択パラメーターに渡すときに使用するものです。

=SPLIT(JOIN(Parameters!<your param name>.Value,","),",")
于 2009-03-18T22:54:39.387 に答える
20

これは、SQL Reporting Services でサポートされていない機能の 1 つです。

必要なことは、選択したすべてのアイテムを単一の文字列としてストアド プロシージャに渡すことです。文字列内の各要素はコンマで区切られます。

次に、提供された文字列をテーブルとして返す関数を使用して文字列を分割します。下記参照。

ALTER FUNCTION [dbo].[fn_MVParam]
   (@RepParam nvarchar(4000), @Delim char(1)= ',')
RETURNS @Values TABLE (Param nvarchar(4000))AS
  BEGIN
  DECLARE @chrind INT
  DECLARE @Piece nvarchar(100)
  SELECT @chrind = 1 
  WHILE @chrind > 0
    BEGIN
      SELECT @chrind = CHARINDEX(@Delim,@RepParam)
      IF @chrind  > 0
        SELECT @Piece = LEFT(@RepParam,@chrind - 1)
      ELSE
        SELECT @Piece = @RepParam
      INSERT  @Values(Param) VALUES(CAST(@Piece AS VARCHAR))
      SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind)
      IF LEN(@RepParam) = 0 BREAK
    END
  RETURN
  END

その後、次のように、メイン クエリの where 句で結果を参照できます。

where someColumn IN(SELECT Param FROM dbo.fn_MVParam(@sParameterString,','))

このソリューションが役立つことを願っています。ご不明な点がございましたら、お気軽にお問い合わせください。

乾杯、ジョン

于 2009-02-04T17:08:43.497 に答える
9

John Sansom と Ed Harper は優れたソリューションを提供しています。ただし、ID フィールド (つまり、整数) を処理するときにそれらを機能させることができませんでした。以下の分割関数を変更して、値を整数としてキャストし、テーブルが主キー列と結合するようにしました。また、区切りリストの順序が重要な場合に備えて、コードにコメントを付けて順序の列を追加しました。

CREATE FUNCTION [dbo].[fn_SplitInt]
(
    @List       nvarchar(4000),
    @Delimiter  char(1)= ','
)
RETURNS @Values TABLE
(
    Position int IDENTITY PRIMARY KEY,
    Number int
)

AS

  BEGIN

  -- set up working variables
  DECLARE @Index INT
  DECLARE @ItemValue nvarchar(100)
  SELECT @Index = 1 

  -- iterate until we have no more characters to work with
  WHILE @Index > 0

    BEGIN

      -- find first delimiter
      SELECT @Index = CHARINDEX(@Delimiter,@List)

      -- extract the item value
      IF @Index  > 0     -- if found, take the value left of the delimiter
        SELECT @ItemValue = LEFT(@List,@Index - 1)
      ELSE               -- if none, take the remainder as the last value
        SELECT @ItemValue = @List

      -- insert the value into our new table
      INSERT INTO @Values (Number) VALUES (CAST(@ItemValue AS int))

      -- remove the found item from the working list
      SELECT @List = RIGHT(@List,LEN(@List) - @Index)

      -- if list is empty, we are done
      IF LEN(@List) = 0 BREAK

    END

  RETURN

  END

前述のように、この関数を次のように使用します。

WHERE id IN (SELECT Number FROM dbo.fn_SplitInt(@sParameterString,','))
于 2010-03-26T13:00:37.027 に答える
5

オラクル:

「IN」句 (Ed's Solution) は、Oracle 接続 (少なくともバージョン 10) に対しては機能しません。ただし、この簡単な回避策が見つかりました。データセットのパラメーターのタブを使用して、多値パラメーターを CSV に変換します。

    :name =join(Parameters!name.Value,",")

次に、SQL ステートメントの WHERE 句で instring 関数を使用して一致を確認します。

    INSTR(:name, TABLE.FILENAME) > 0
于 2009-11-02T22:21:35.640 に答える
4

他の点では素晴らしいfn_MVParamで問題が発生しました。SSRS 2005は、アポストロフィを2つの引用符として使用してデータを送信しました。

これを修正するために1行追加しました。

select @RepParam = replace(@RepParam,'''''','''')

私のバージョンのfnも、nvarcharの代わりにvarcharを使用しています。

CREATE FUNCTION [dbo].[fn_MVParam]
   (
    @RepParam varchar(MAX),
    @Delim char(1)= ','
   )
RETURNS @Values TABLE (Param varchar(MAX)) AS
/*
  Usage:  Use this in your report SP 
     where ID in (SELECT Param FROM fn_MVParam(@PlanIDList,','))
*/

BEGIN

   select @RepParam = replace(@RepParam,'''''','''')
   DECLARE @chrind INT
   DECLARE @Piece varchar(MAX)
   SELECT @chrind = 1
   WHILE @chrind > 0
      BEGIN
         SELECT @chrind = CHARINDEX(@Delim,@RepParam)
         IF @chrind > 0
            SELECT @Piece = LEFT(@RepParam,@chrind - 1)
         ELSE
            SELECT @Piece = @RepParam
         INSERT @VALUES(Param) VALUES(@Piece)
         SELECT @RepParam = RIGHT(@RepParam,DATALENGTH(@RepParam) - @chrind)
         IF DATALENGTH(@RepParam) = 0 BREAK
      END
   RETURN
END
于 2011-04-19T19:08:25.237 に答える
3

偉大なジョンの解決策の修正、解決:

  • 「2引用符」エラー
  • パラメータ内の1つのピースの後のスペース

    
    ALTER FUNCTION [dbo].[fn_MVParam]
    (@RepParam nvarchar(4000), @Delim char(1)= ',')
    RETURNS @Values TABLE (Param nvarchar(4000))AS
    BEGIN
    //2 quotes error
    set @RepParam = replace(@RepParam,char(39)+char(39),CHAR(39))
    DECLARE @chrind INT
    DECLARE @Piece nvarchar(100)
    SELECT @chrind = 1 
    WHILE @chrind > 0
    BEGIN
      SELECT @chrind = CHARINDEX(@Delim,@RepParam)
      IF @chrind  > 0
        SELECT @Piece = LEFT(@RepParam,@chrind - 1)
      ELSE
        SELECT @Piece = @RepParam
      INSERT  @Values(Param) VALUES(CAST(@Piece AS VARCHAR(300)))
      //space after one of piece in parameter: LEN(@RepParam + '1')-1
      SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam + '1')-1 - @chrind)
      IF LEN(@RepParam) = 0 BREAK
    END
    RETURN
    END
    
    
于 2012-02-03T12:53:50.763 に答える
3

これは、文字列の個別のセット (例: "START"、"END"、"ERROR"、"SUCCESS")

に対して機能しました 1) Report-Parameter (例: @log_status ) を定義し、「Allow multiple values」をチェック
ここに画像の説明を入力

2) データセットを定義する
3) データセット プロパティ ウィンドウを開く
3a) クエリ タブにクエリを入力します。

select * from your_table where (CHARINDEX(your_column, @log_status,0) > 0)

3b) パラメータ タブでパラメータを入力します。たとえば、
Parametername: @log_status ; Parametervalue: <<Expr>>
3c) Expr の場合は、[fx] ボタンをクリックして次のように入力します。

=join(Parameters!log_status.Value,",")

ここに画像の説明を入力

終了した!(これは Ed Harper のソリューションに似ていますが、これがうまくいかなかったと言って申し訳ありません)

于 2018-05-24T19:54:14.557 に答える
2
  1. レポートのリストのデータセットを作成する
  2. パラメータを右クリックして、使用可能な値を選択します
  3. 新しく作成したデータセットをデータセットとして選択
  4. 値フィールドとしてストアド プロシージャに渡す値を追加します。
  5. パラメータの説明をラベル フィールドに追加します (パラメータが customerID の場合、ラベルは CustomerName などになります)。
  6. 最後に、次のコードをストアド プロシージャに追加します。

@paramName AS NVARCHAR(500) を宣言し、

IF RIGHT(@paramName, 1) = ',' BEGIN SET @paramName = LEFT((@paramName, LEN((@paramName)-1) END

于 2013-06-27T13:58:30.050 に答える
2

最初に複数の値をテーブルに追加してから、後で使用するためにデータを別のテーブルに保存したり、別のテーブルに値を追加したりすることができます。 .

データセットの式を介してパラメータ値を設定します。

="SELECT DISTINCT * FROM (VALUES('" & JOIN(Parameters!SearchValue.Value, "'),('") & "')) 
AS tbl(Value)"

クエリ自体:

DECLARE @Table AS TABLE (Value nvarchar(max))

INSERT INTO @Table EXEC sp_executeSQL @SearchValue 

ワイルドカードの例:

SELECT * FROM YOUR_TABLE yt 

INNER JOIN @Table rt ON yt.[Join_Value] LIKE '%' + rt.[Value] + '%'

動的 SQL を使用せずにそれを行う方法を見つけたいと思っていますが、SSRS がパラメーターを実際のクエリに渡す方法が原因でうまくいかないと思います。誰かがよく知っているなら、私に知らせてください。

于 2016-08-05T18:42:05.623 に答える
1

クエリ文字列を介してRSに複数の値を渡したい場合は、値ごとにレポートパラメータを繰り返すだけです。

例えば; COLSというRS列があり、この列には1つ以上の値が必要です。

&rp:COLS=1&rp:COLS=1&rp:COLS=5 etc..
于 2012-03-12T22:59:12.903 に答える
1

また、ストアド プロシージャに次のコードを追加することもできます。

set @s = char(39) + replace(@s, ',', char(39) + ',' + char(39)) + char(39)

(@s が多値文字列 ("A,B,C" など) であると仮定します)

于 2010-12-13T15:12:24.333 に答える
1

これは、結合関数を使用して複数値パラメーターを保存し、後でデータベースからまったく同じ選択を復元することについてです。

パラメーターを保存する必要があるレポートを終了したところです。レポートを再度開くと (レポートに OrderID パラメーターが渡されます)、ユーザーが以前に選択した値をもう一度選択する必要があります。

レポートでは 6 個のパラメーターが使用され、それぞれに独自のデータ セットと結果のドロップダウン リストがありました。パラメーターは、最終的な選択の範囲を狭めるために以前のパラメーターに依存していました。レポートが「表示」されると、格納するためにストアド プロシージャが呼び出されました。

ストアド プロシージャは、レポートから渡された各パラメータを受け取りました。データベース内のストレージ テーブルをチェックして、その OrderID のパラメーターが保存されているかどうかを確認しました。そうでない場合は、すべてのパラメーターを保存しました。その場合、その注文のすべてのパラメーターが更新されます (これは、ユーザーが後で気が変わった場合です)。

レポートが実行されると、SQL テキストであるデータセット dsParameters が存在し、その orderID の単一の行があればそれを選択します。レポート内の各パラメーターは、このデータセットからデフォルト値を取得し、そのパラメーター専用のデータセットから選択リストを取得します。

複数選択パラメーターで問題が発生しました。メイン データセット パラメーター リストで join(@Value,",") コマンドを使用し、ストアド プロシージャにカンマ区切りの文字列を渡しました。しかし、それを復元する方法は?コンマ区切りの文字列をパラメータのデフォルト値ボックスに戻すことはできません。

あなたが話しているのと同様の方法で、パラメーターを分割するために別のデータセットを作成する必要がありました。次のようになります。

IF OBJECT_ID('tempdb..#Parse','U') IS NOT NULL DROP TABLE #Parse

DECLARE @Start int, @End int, @Desc varchar(255)

SELECT @Desc = fldDesc FROM dbCustomData.dbo.tblDirectReferralFormParameters WHERE fldFrom = @From and fldOrderID = @OrderID

CREATE TABLE #Parse (fldDesc varchar(255))

SELECT @Start = 1, @End = 1

WHILE @End > 0
    BEGIN
        SET @End = CHARINDEX(',',@Desc,@Start)
        IF @End = 0 
            BEGIN
                INSERT #Parse SELECT REPLACE(SUBSTRING(@Desc,@Start,LEN(@Desc)),',','') AS fldDesc 
                BREAK
            END
        ELSE        
            BEGIN
                INSERT #Parse SELECT REPLACE(SUBSTRING(@Desc,@Start,@End-@Start),',','') AS fldDesc 
            END
        SET @Start = @End + 1
    END

SELECT * FROM #Parse

フォームが開くたびに、このデータセットはデータベースをチェックして、この多値パラメーターの保存された文字列を探します。存在しない場合は null を返します。オンの場合、カンマが解析され、値ごとに行が作成されます。

次に、デフォルト値ボックスがこのデータセットと fldDesc に設定されます。できます!1つまたは複数を選択すると、フォームが再度開かれたときに保存されて補充されます。

これが役立つことを願っています。しばらく検索しましたが、結合文字列をデータベースに保存してからデータセットで解析するという言及は見つかりませんでした。

于 2013-05-03T23:34:58.613 に答える
1

過去に、私はストアド プロシージャと関数を使用して、レポート サービスの SQL Server クエリで複数の年を選択することに頼っていました。Ed Harper が提案したようにクエリ パラメータ値で Join 式を使用しても、where ステートメントの SQL IN 句では機能しません。私の解決策は、パラメーター Join 式とともに where 句で次を使用することでした: and charindex (cast(Schl.Invt_Yr as char(4)) , @Invt_Yr) > 0

于 2013-03-20T19:25:30.560 に答える
1

これは私にとってうまくいきます:

WHERE CHARINDEX(CONVERT(nvarchar, CustNum), @CustNum) > 0
于 2014-05-29T15:28:36.833 に答える
1

私はこのサイトに不慣れで、以前の回答にコメントする方法がわかりませんでした。また、ジェフの投稿に賛成票を投じることもできませんでした。それが私の答えを与えてくれたと信じています。いずれかの方法...

いくつかの優れた投稿とその後の微調整がどのように機能するかを確認できますが、データベースへの読み取りアクセス権しかないため、UDF、SP、またはビューベースのソリューションは機能しません。したがって、VenkateswarluAvula のコメントを除いて、Ed Harper のソリューションは適切に見えましたが、カンマ区切りの文字列をパラメーターとして WHERE IN 句に渡すことはできず、必要に応じて機能することを期待することはできません。しかし、ORACLE 10g に対する Jeff のソリューションは、そのギャップを埋めます。これらを Russell Christopher のブログ投稿 ( http://blogs.msdn.com/b/bimusings/archive/2007/05/07/how-do-you-set-select-all-as-the-default- ) にまとめました。for-multi-value-parameters-in-reporting-services.aspxと私は私の解決策を持っています:

使用可能な値のソース (おそらくデータセット) を使用して、複数選択パラメーター MYPARAMETER を作成します。私の場合、複数選択は一連の TEXT エントリからのものでしたが、微調整すれば他のタイプでも機能するはずです。[すべて選択] をデフォルトの位置にする場合は、同じソースをデフォルトとして設定します。これによりユーザー インターフェイスが提供されますが、作成されたパラメーターは SQL に渡されるパラメーターではありません。

SQL と WHERE IN (@MYPARAMETER) 問題に対する Jeff の解決策に進みますが、値 ('Charge') の 1 つが他の値 ('Non Charge') の 1 つに現れるという点で、私自身の問題があります。 )、CHARINDEX が誤検知を検出する可能性があることを意味します。前と後の両方で区切り値のパラメーターを検索する必要がありました。これは、コンマ区切りリストの先頭と末尾にもコンマがあることを確認する必要があることを意味します。そして、これは私のSQLスニペットです:

where ...
and CHARINDEX(',' + pitran.LINEPROPERTYID + ',', @MYPARAMETER_LIST) > 0

中間のビットは、次のように別のパラメーターを作成することです (本番環境では隠されていますが、開発中は隠されていません)。

  • MYPARAMETER_LIST の名前
  • テキストのタイプ
  • の単一の使用可能な値 と、 実際には重要ではない="," + join(Parameters!MYPARAMETER.Value,",") + ","ラベル(表示されないため)。
  • まったく同じデフォルト値
  • 念のため、両方のパラメーターの高度なプロパティで常に更新を設定します

SQL に渡されるのはこのパラメーターであり、たまたま検索可能な文字列ですが、SQL はテキストのように処理します。

これらの答えの断片をまとめることが、誰かが探しているものを見つけるのに役立つことを願っています.

于 2013-02-14T19:41:53.447 に答える
1

そのため、テキスト値を乗算すると、=join(Parameter!Customer.Value,"','") を使用してそれぞれを一重引用符で囲んだクエリになります。したがって、「.Value」の後は、コンマ、二重引用符、単一引用符、コンマ、単一引用符、二重引用符、閉じ括弧です。シンプル:)

于 2016-12-09T11:24:25.557 に答える