Pourquoi le passage de plusieurs parameters de valeur entière dans SSRS génère une erreur de conversion?

Ma procédure est quelque chose comme ça, très simple.

ALTER PROCEDURE dbo.MyProcedure @NoteStoreType INT AS SELECT Column1, Column2, Column3 FROM tblNoteStore WHERE tblNoteStore.Type IN (COALESCE(@NoteStoreType, tblNoteStore.Type)) 

Mon dataset pour remplir les valeurs de parameters disponibles:

 SELECT DISTINCT tblNoteStore.Type, lstNoteTypes.Description FROM tblNoteStore INNER JOIN lstNoteTypes ON tblNoteStore.Type = lstNoteTypes.NoteTypeID ORDER BY lstNoteTypes.Description 

Renvoie ce résultat:

entrez la description de l'image ici

Ensuite, je vais dans properties du paramètre de rapport pour autoriser plusieurs valeurs:

entrez la description de l'image ici

Maintenant, définissez les valeurs disponibles:

entrez la description de l'image ici

Ensuite, si j'exécute le rapport avec plus d'une valeur, cela me donne une erreur:

entrez la description de l'image ici

Je sais que cela arrive parce que SSRS traite plusieurs valeurs comme une string, en les passant par une virgule.

Mais quel serait le travail dans cette situation?

J'essaie d'éviter SQL dynamic car il est plus difficile à maintenir. Vous pouvez appliquer ce paramètre en tant que filter dans le SQL ou vous pouvez l'appliquer au niveau de l'set de données après l'exécution de la requête.

L'ajout d'un filter de jeu de données est assez simple. Le seul inconvénient est qu'il est less efficace. Si la différence de vitesse est insignifiante, c'est une bonne option. entrez la description de l'image ici

Dans certaines versions de SSRS, vous pouvez utiliser une instruction IN régulière dans le SQL:

 WHERE tblNoteStore.Type IN (@NoteStoreType) 

Si cela ne fonctionne pas avec votre version, vous pouvez également utiliser une fonction Split personnalisée dans votre SQL pour séparer la string séparée par des virgules en valeurs individuelles. Il existe déjà de nombreuses réponses à ce sujet spécifique.

Le paramètre @NoteStoreType INT dans votre procédure stockée est un INTEGER unique, pas une list de valeurs entières. Vous devriez essayer avec une requête dynamic:

 CREATE PROCEDURE dbo.MyProcedure @NoteStoreType NVARCHAR(2048) AS BEGIN DECLARE @cmd NVARCHAR(MAX) SET @cmd = 'SELECT Column1, Column2, Column3 FROM tblNoteStore WHERE tblNoteStore.Type IN (' + @NoteStoreType + ')'; EXEC (@cmd); END GO 

Vérifiez-le ici: http://rextester.com/NWLLU92997