J'ai le sql suivant:

--DECLARE @absent nvarchar(20)
--SET @absent = 'Y' -- Not needed in sql as we are setting this in ssrs

SELECT * 
FROM Employee
WHERE Absent in @Absent

Voici la table des employés.

Employee 
Name Absent 
Dan    Y
Laura  N
Ross   N
James  Y

Je veux pouvoir filtrer entre Y et N et les deux.

Cela fonctionne très bien pour moi dans SSRS lorsque je passe @absent à la fois Y et N. Cependant, lorsque je convertis en procédure stockée et que je l'exécute dans SSRS, j'obtiens maintenant un problème. J'obtiens plus de résultats.

ALTER PROCEDURE usp_GetEmployees
@Absent nvarchar(20)

    SELECT * 
    FROM Employee
    WHERE Absent in @Absent

J'ai essayé la ligne =join(parameters!Absent.value,",") dans les propriétés des paramètres mais pas de chance. Je crois que le problème est lié au type de données qui est transmis. Il est juste étrange que cela fonctionne avant que je ne me convertisse en usp.

Toute aide est très appréciée :)

1
Greg 23 sept. 2020 à 15:02

3 réponses

Meilleure réponse

Votre code d'origine ne fonctionnerait pas directement dans SQL. Vous pouvez le corriger en utilisant des parenthèses:

 WHERE Absent in (@Absent)

C'est exactement équivalent à:

WHERE Absent = @Absent

Ce n'est probablement pas ce que vous envisagez. Dans les versions les plus récentes de SQL Server, vous pouvez utiliser:

WHERE Absent IN (SELECT value FROM string_split(@Absent, ','))

Le ',' est mon estimation du séparateur que vous utilisez. Vous pouvez aussi utiliser:

WHERE ',' + @Absent + ',' LIKE '%,' + Absent + ',%'
1
Gordon Linoff 23 sept. 2020 à 12:04

Avec SSRS, si vous utilisez une procédure stockée, le format Column IN (@Variable) ne fonctionne pas. Ce type de requête fonctionne uniquement si le SQL est directement dans la définition de l'ensemble de données SSRS. Ensuite, SSRS remplacera la valeur de @Variable et (apparemment) injectera en toute sécurité les valeurs dans une liste délimitée et citée.

Pour quelque chose d'aussi simple:

SELECT * 
FROM Employee
WHERE Absent in (@Absent);

Si ce n'est pas le cas et que vous devez utiliser une procédure stockée, SSRS transmet une chaîne délimitée en tant que paramètre. Dans de tels cas, vous devez utiliser un séparateur. Considérant que vous étiquetez BIDS (), alors vous devez utiliser une méthode très ancienne de le faire. Je vous recommande également fortement de regarder les chemins de mise à niveau dès que possible.

Pour 2008, je recommande delimitedsplit8K (ou delimitedsplitN4K si vous utilisez un nvarchar). Ensuite, votre procédure ressemblera à ceci:

ALTER PROCEDURE usp_GetEmployees @Absent nvarchar(4000) AS
BEGIN

    SELECT E.* --YOu should replace this with your actual columns
    FROM Employee E
         JOIN dbo.delimitedsplitN4K(@Absent,',') DS ON E.Absent = DS.item;
END;
1
Larnu 23 sept. 2020 à 12:23

En supposant que vous ayez une faute de frappe dans votre question et que vous vouliez écrire

SELECT * 
FROM Employee
WHERE Absent in (@Absent)

La raison pour laquelle cela fonctionnera lorsqu'il est utilisé directement dans une requête d'ensemble de données est que SSRS prendra les options sélectionnées de votre paramètre à valeurs multiples, les convertira en une liste séparée par des virgules et les injectera dans le SQL. Donc, ce qui sera réellement exécuté sera, par exemple,

SELECT * 
FROM Employee
WHERE Absent in ('Y', 'N')

Ce processus n'est pas le même lors de l'appel d'une procédure stockée car SSRS ne peut pas modifier le code à l'intérieur de votre SP.

Lorsque vous passez des paramètres à valeurs multiples à un processus stocké, vous passez généralement une expression telle que =JOIN(Parameters!myParam.Value, ","). Cela passe dans une chaîne contenant une liste séparée par des virgules de vos valeurs de paramètres sélectionnées.

À l'intérieur du processus stocké, vous appelleriez généralement une fonction pour diviser cette chaîne en une table à laquelle vous pouvez vous joindre.

Il existe de nombreux articles décrivant cela et fournissant une fonction split utilisable au cas où vous n'en auriez pas. Consultez les réponses ici https://social.msdn.microsoft.com/Forums/sqlserver/en-US/0ead7ceb-3fdd-4625-aa82-1d4195f984b1/passing-multivalue-parameter -in-stored-procedure-ssrs? forum = sqlreportingservices

2
Alan Schofield 23 sept. 2020 à 12:19