J'ai une procédure stockée qui renvoie plusieurs résultats comme ci-dessous
Create StoredProcedure sp_MultipleDataSets
as
begin
SELECT EMPID, ENAME, JOB, SAL, DEPTID FROM EMP -- first result set
SELECT DEPTID, DNAME, LOC FROM DEPT --second result set
end
Dans BIDS, lors de la création d'un nouveau rapport, j'ai configuré la procédure stockée pour le jeu de données. Il crée UNIQUEMENT le jeu de données avec les colonnes renvoyées du premier jeu de résultats. Il n'identifie pas le deuxième jeu de résultats.
Comment créer des ensembles de données pour les ensembles de résultats à partir d'une procédure stockée comme ci-dessus
Malheureusement, comme l'explique la documentation ici :
Si plusieurs ensembles de résultats sont extraits via une seule requête, seul le premier ensemble de résultats est traité et tous les autres ensembles de résultats sont ignorés.
(Trouvé via cette question .)
Par conséquent, je suggère d'utiliser l'une des deux possibilités suivantes:
(1) Divisez la procédure en deux procédures distinctes - une qui renvoie les données de EMP et l'autre de DEPT - et accédez aux nouvelles procédures en tant que deux jeux de données distincts.
(2) Associez les deux requêtes distinctes (avec une colonne supplémentaire pour indiquer quelle requête a été produite pour chaque ligne) et filtrez ou formatez sous forme conditionnelle votre rapport de manière appropriée. La requête en union pourrait ressembler à ceci:
SELECT EMPID ID, ENAME NAME, JOB JOB_LOC, SAL, DEPTID, 'EMP' SOURCE
FROM EMP
UNION ALL
SELECT DEPTID ID, DNAME NAME, LOC JOB_LOC, NULL SAL, DEPTID DEPTID, 'DEPT' SOURCE
FROM DEPT
J'utilise un paramètre dans le SP pour extraire plusieurs jeux de résultats dans SSRS tout le temps . Vous devez les séparer par des instructions IF dans le SP et vous devez également HAND TYPE out the ZONES dans la configuration du jeu de données SSRS.
Semble whacky, mais ça marche ...
Voici un exemple.
La procédure stockée (SP) a 2 paramètres définis @OfficerID @DatasetFlag
Le @OfficerID est le numéro d'employé à passer ou à entrer (formulaire de saisie de données SSRS) Le DatasetFlag est la façon dont je contrôle quelle instruction IF est exécutée dans le SP.
CREATE PROCEDURE [dbo].[StoredProcedureNameHere]
@OfficerID VARCHAR(7),
@DatasetFlag VARCHAR(60)
WITH RECOMPILE
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON;
BEGIN TRY
IF @DatasetFlag = 'EmployeeName'
Begin
SELECT [EmployeeName]
FROM [DatabaseName].[scema].[Employee]
where EmployeeBNumber = @OfficerID
END
ELSE
IF @DatasetFlag = 'Expect'
Begin
SELECT
[TerritoryName]
,[TestNumber]
,[RuleNumber]
,[Expectation]
,[TestCount]
,[PercentToGoal]
FROM [Database].[scema].[Table2]
WHERE OfficerID = @OfficerID
ORDER BY TerritoryID
,TestNumber
,RuleNumber
END
RETURN
GO
Le rapport a 2 jeux de données, un que je crée et il entrera dans les paramètres et EmployeeName L'autre que je crée et il tire dans EmployeeName comme SSRS ne peut utiliser que 1 Result SET! !__. BUT .... I bool il ....
mais je crée simplement les champs en sur-dimensionnant le nom d’employé, puis ajoute le.
Ensuite, j’ai besoin du menu PARAMETERS (Propriétés du jeu de données) pour insérer une EXPRESSION de = "EmployeeName" Pour le premier jeu de données et = "Expect" pour le second. Je fais correspondre le @OfficeID sur cet écran aussi.
puis quand je lance ceci ... il demande OfficerID (RS crée le formulaire de saisie) et quand je mets dans l'ID et clique sur VIEW REPORT. Ou nous pouvons tous les RDL avec le OfficerID, tout comme le formulaire SSRS, mais dans une page ASPX.
DEUX DONNÉES DE JEU sont retournées (il l’appelle deux fois, c’est mon hypothèse)
Donc, NO Whacky FILTERING sur un jeu de données UNION ou d’autres astuces que je dois ensuite traiter dans SSRS, ce qui n’est pas amusant ... (sérieusement IIF?)
J'ai vu une procédure stockée où nous avons comme 20 paramètres, de sorte que vous pouvez filtrer La sortie du rapport au niveau SQL, plutôt que d'un monstre tirer et filtrer au rapport.
Non, vous pouvez simplement créer 20 procédures stockées, BIEN OUI, mais de cette façon, tout le code est placé dans UN emplacement, et bien sûr, il peut utiliser des sélections dans des tables TEMP pour fusionner des tonnes de documents,. table qui est le RESULT SET ..
En tant que programmeur, je trouve SSRS un peu farfelu, mais jusqu'à présent, je m'amuse à essayer de trouver le moyen d'obtenir ce que je veux, pas ce qu'il offre ...
Essayez quelque chose comme ça:
Create StoredProcedure sp_MultipleDataSets(@Param nvarchar(10))
as
begin
if(@Param == "first")
begin
SELECT EMPID, ENAME, JOB, SAL, DEPTID FROM EMP -- first result set
end
if(@Param == "second")
begin
SELECT DEPTID, DNAME, LOC FROM DEPT --second result set
end
end
Voici un truc pour ça. Ceci suit l'idée de "Union All" tous les résultats pour une table et fonctionne avec ssrs repost avec table
Pour chaque requête distincte, ajoutez une colonne où indique le but de la requête. Par exemple, "nom" ou "adresse", cette information est répétée pour chaque ligne de la requête.
Puis Union Toutes les requêtes demandées.
Au niveau des rapports Visual studio/ssrs: Ajoutez le jeu de données qui contient la procédure stockée. Ensuite, dans le menu Outils, sélectionnez le tableau matriciel et faites glisser les données souhaitées vers les colonnes de tableau matriciel. Ensuite, allez dans les propriétés des tableaux de tableaux -> Visibilité des lignes. pour cela, faites la clause de tri avec la fonction IFF pour afficher uniquement les lignes avec la colonne supplémentaire précédemment définie dans les requêtes, par exemple "Nom" Créez ensuite le deuxième tablix et suivez-le, utilisez maintenant la fonction IIF avec "Adresse", puis continuer en tant que manu différentes tables nécessaires.