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?
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:
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èteVoici 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!
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.
sp_YourStoredProc @Parameter1....@ParameterN
BTW, j'utilise SQL 2012
J'espère que cela t'aides.
Voici ce que j'ai fait pour résoudre le problème - Les champs ne sont pas répertoriés dans SSRS
À 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
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
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.
Maintenant, j'ai vérifié que les champs sont remplis pour SSRS
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:
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.
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.
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.