70 votes

Passage de plusieurs valeurs pour un seul paramètre dans Reporting Services

J'ai plusieurs paramètres de sélection multiple dans mon rapport. J'essaie de trouver un moyen de transmettre plusieurs valeurs pour un seul paramètre dans la chaîne de requête Web? Si je passe dans une seule valeur, cela fonctionne bien.

Le rapport fonctionne correctement en sélectionnant plusieurs choix pour un seul paramètre. Mon problème réside dans la chaîne de requête Web.

102voto

Ed Harper Points 13289

Bien que la solution de John Sansom fonctionne, il existe un autre moyen de le faire, sans avoir à utiliser un fichier UDF scalaire potentiellement inefficace. Dans le rapport SSRS, sous l'onglet Paramètres de la définition de la requête, définissez la valeur du paramètre sur

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

Dans votre requête, vous pouvez ensuite référencer la valeur comme suit:

 where yourColumn in (@<your param name>)
 

20voto

John Sansom Points 20087

C'est l'un des pauvres fonctionnalités prises en charge dans SQL Reporting Services.

Ce que vous devez faire est de passer tous vos articles sélectionnés comme une simple chaîne de votre procédure stockée. Chaque élément de la chaîne seront séparés par une virgule.

Ce que je puis faire est de diviser la chaîne en utilisant une fonction qui retourne la condition de chaîne en un tableau. Voir ci-dessous.

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

Vous pouvez ensuite référence aux résultats dans la clause where de la requête comme ceci:

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

J'espère que cela vous trouver cette solution pour être d'utilisation. N'hésitez pas à poser toutes les questions que vous pourriez avoir.

Cheers,John

9voto

CodeGrue Points 2109

John Sansom et Ed Harper ont d'excellentes solutions. Cependant, je ne pouvais pas les faire fonctionner avec des champs d'identification (c.-à-d. Des entiers). J'ai modifié la fonction split ci-dessous pour CAST les valeurs sous forme d'entiers afin que la table se joigne aux colonnes de clé primaire. J'ai également commenté le code et ajouté une colonne pour ordre, au cas où l'ordre de la liste délimitée serait significatif.

 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
 

Utilisez cette fonction comme indiqué précédemment avec:

 WHERE id IN (SELECT Number FROM dbo.fn_SplitInt(@sParameterString,','))
 

5voto

Jeff Points 1873

ORACLE:

La phrase "IN" (Solution d'Ed) ne fonctionnera pas avec une connexion Oracle (au moins la version 10). Cependant, trouvé cette solution de contournement simple qui fait. À l'aide de l'onglet du paramètre du jeu de données, convertissez le paramètre multivaleur en un fichier CSV:

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

Ensuite, dans la clause WHERE de votre instruction SQL, utilisez la fonction instring pour rechercher une correspondance.

     INSTR(:name, TABLE.FILENAME) > 0
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X