web-dev-qa-db-fra.com

Pas de champs pour la procédure stockée SQL dynamique dans SSRS avec SET FMTONLY

J'ai le SP suivant qui fonctionne correctement lorsqu'il est exécuté seul:

USE [Orders]
GO
SET FMTONLY OFF; 

CREATE PROCEDURE [dbo].[Get_Details_by_Type]

@isArchived varchar(10),
@Type varchar(50)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    declare @sqlQuery nvarchar(max)
          IF(@isArchived = 'ALL')
            BEGIN
                set @sqlQuery  = 'SELECT *  FROM [dbo].[Orders] 
              WHERE ' + @Type + ' != € 
                ORDER BY [IDNumber]'
                exec sp_executesql @sqlQuery
            END
        ELSE
            BEGIN
            set @sqlQuery  = 'SELECT * FROM [dbo].[Orders] 
          WHERE ' + @Type + ' != € AND [isArchived] = ' + @isArchived + ' ORDER BY [IDNumber]'
            exec sp_executesql @sqlQuery
        END
END
SET FMTONLY ON; 

Le problème que je rencontre est que lorsque j'ajoute un ensemble de données pour un rapport SSRS, il ne génère aucun champ/colonne dans la section Champs. Je suppose que c'est dû au SQL dynamique?

Comment puis-je résoudre cela?

15
sd_dracula

Le problème
Les procédures stockées qui contiennent des tables SQL et SQL dynamiques sont le fléau des assistants tels que les générateurs SSRS et ORM tels que les outils de reverse engineering Linq2SQL et EF.

En effet, les outils SET FMTONLY ON; (ou plus récemment, sp_describe_first_result_set ) avant d'exécuter le PROC, afin de dériver le schéma de jeu de résultats produit par le PROC afin que les mappages de l'interface utilisateur de ReportViewer puissent être générés. Cependant, ni FMTONLY ON ni sp_describe_first_result n'exécutent réellement le PROC.

par exemple. l'outil fera quelque chose comme:

SET FMTONLY ON;
EXEC dbo.MyProc NULL;

Quelques solutions de contournement: 

  • Éditez manuellement le fichier RDL/RDLC pour insérer les noms et les types de colonne du jeu de résultats réel.
  • Supprimer temporairement le proc réel et le remplacer par un autre qui renvoie un ensemble de données de zéro ligne ou plus avec les types de données et les noms de colonnes réels renvoyés par le proc réel, en exécutant l'assistant, puis en le retournant.
  • Ajout de SET FMTONLY OFF; en tant que première ligne du PROC - cela forcera l'exécution du PROC (bien que votre proc puisse échouer à cause de paramètres nuls ou factices transmis par l'outil). De plus, FMTONLY est obsolète
  • Au début du processus, ajout d'une instruction fictive qui renvoie le ou les schémas réels du ou des ensembles de résultats, encapsulés dans une branche conditionnelle qui n'est jamais exécutée.

Voici un exemple du dernier piratage:

CREATE PROCEDURE [dbo].[Get_Details_by_Type]
  @isArchived varchar(10),
  @Type varchar(50)
AS
BEGIN
   -- For FMTONLY ON tools only
   IF 1 = 2
     BEGIN
       -- These are the actual column names and types returned by the real proc
       SELECT CAST('' AS NVARCHAR(20)) AS Col1, 
              CAST(0 AS DECIMAL(5,3)) AS Col2, ...
     END;
-- Rest of the actual PROC goes here

FMTONLY ON/sp_describe_first_result_set sont trompés par le conditionnel factice et assume le schéma de la branche jamais exécutée.

En passant, pour votre propre santé mentale, je vous suggérerais de ne pas SELECT * dans votre PROC - listez plutôt explicitement tous les noms de colonnes réels renvoyés par Orders

Enfin, assurez-vous de ne pas inclure l'instruction SET FMTONLY ON; dans votre proc (à partir de votre code ci-dessus!)

END - Proc
GO **
SET FMTONLY ON; ** This isn't part of the Proc!
19
StuartLC

Si quelqu'un est toujours confronté à ce problème, j'ai résolu ce qui semble être un problème similaire avec ssrs et SQL dynamique. 

  1. Pour que les cartes mappent correctement les champs du SP, 
  2. sélectionnez l'option "Texte" sous le type de requête, 
  3. entrez le nom SP et les paramètres tels que vous l'appelez et la fenêtre SSMS. sp_YourStoredProc @Parameter1....@ParameterN
  4. Cliquez sur le bouton Actualiser les champs. 
  5. Lorsque l'instruction est exécutée, les champs sont actualisés et votre matrice est remplie.

BTW, j'utilise SQL 2012

J'espère que cela t'aides.

4
ChadB

Voici ce que j'ai fait pour résoudre le problème - Les champs ne sont pas répertoriés dans SSRS

  1. À l'origine j'ai la procédure stockée; et il renvoie des données lorsque j'exécute le jeu de données. Mais les champs ne sont pas listés dans SSRS

  2. J'ai copié le texte de la procédure stockée et transformé l'ensemble de données en Text au lieu de Stored Procedure. Référer Comment: actualiser les champs pour un jeu de données

  3. Cela a produit des erreurs et j'ai "ignoré" ces erreurs. Reportez-vous La construction ou l'instruction SQL du curseur Declare n'est pas prise en charge.

  4. Maintenant, j'ai vérifié que les champs sont remplis pour SSRS

  5. Maintenant, j'ai mis à jour le jeu de données pour utiliser mon Stored Procedure

Après les étapes ci-dessus, effectuez une actualisation de l'ensemble de données comme indiqué ci-dessous:

enter image description here

1
Lijo

Suivez les étapes ci-dessous 

•   Delete DataSource. Create a new Data Source .
•   Delete DataSet. Create a new DataSet .
•   Use Query Designer. 
•   Add valid parameter when asked  .
•   One should get result for provided prarameters . 
    Donot click on refresh Field .
•   Then Report parameters and Report field will appear .
•   Now Filter criteria should work.

OU 

**Add the Report field manually . It works.**

Si la procédure stockée ne peut pas récupérer les données du schéma ou les métadonnées, nous devons spécifier manuellement les champs du rapport. 

0
Bhushan Mahajan

C'est un ajout très tardif, mais pour ceux d'entre nous qui débutons dans SSRS/Conception de rapports: N'oubliez pas de vérifier l'ordre des paramètres dans le volet Données du rapport de Visual Studio. Ils seront créés de haut en bas, de sorte qu'un paramètre situé en haut ne peut pas dépendre d'un paramètre situé en bas. C’était un problème que j’avais avec un seul rapport, mais le message d’erreur que j’avais reçu ne l’indiquait pas. J’ai donc poursuivi ma queue pendant des heures pour tenter de le résoudre. 

0
frustratedInFresno

Je ne voulais pas faire revivre un fil mort, mais cela me rendait folle lors de la mise à niveau de nos rapports de SSRS 2005 à SSRS 2016 où les procédures stockées utilisaient openquery.

Nous l'avons réduit aux rapports contenant des champs contenant des valeurs vides. Nous l'avons donc ajouté au début de la procédure stockée:

SET CONCAT_NULL_YIELDS_NULL OFF;

ce qui signifiait que nous n'avions pas besoin de CAST tous les domaines.

0
Phelzier