2009-06-12 3 views
2

Dans les requêtes SQL pour mes jeux de données de services d'établissement de rapports, je voudrais être en mesure d'utiliser le modèle suivant:Utilisez une valeur conditionnelle dans un ensemble de données Reporting Services pour le débogage

-- Used to enable/disable diagnostic statements 
declare @DEBUG bit 
set @DEBUG = 0 

-- Get current date/time. 
declare @now datetime; set @now = getdate() 
if @DEBUG = 1 select @now as now 

-- Create a table to contain the chart values for the last 30 days. 
declare @reportValues table 
(
    reportDate datetime, 
    x int 
) 

-- Populate the table with the last 30 days. 
declare @counter int; set @counter = 0 
while @counter < 5 
begin 
    insert into @reportValues select dateadd(day, [email protected], @now), @counter 
    set @counter = @counter + 1 
end 
if @DEBUG = 1 select * from @reportValues 

select sum(x) as total from @reportValues 

Le problème est, Reporting Services ignore les instructions IF et "select @now as now" pour les valeurs du rapport, au lieu de la requête principale.

Existe-t-il un moyen d'accomplir ce modèle qui contourne cette limitation RS?

Mise à jour: Si vous allez à "SET FMTONLY" help page on the MSDN, quelqu'un a déjà noté ce problème dans un commentaire au bas de la page, et que la désactivation de cette option résout ce problème.

+0

Vérifiez ma modification et voir si cela vous aide plus. – TheTXI

+0

Si je change la valeur ci-dessus en "si @DEBUG = 1 print @now" alors cette partie est corrigée et l'instruction "if @DEBUG = 1 select * from @reportValues" provoque le problème. Heureusement, la plupart du temps, je veux voir des valeurs scalaires et non des tableaux. Cependant, il serait pratique d'imprimer les valeurs d'une table temporaire. –

+0

Merci à Peter de souligner que mettre "SET FMTONLY OFF" en haut de la requête résout ce problème. Je n'ai jamais entendu parler de cette option avant! –

Répondre

2

est-ce que l'ensemble des colonnes varient avec @debug?

Si la base de données est SQL Server, vous pouvez essayer le FMTONLY bidouille:

declare @fmtonlyon bit 
select @fmtonlyon = 0 
if 1 = 0 select @fmtonlyon = 1 
if @fmtonlyon = 1 set fmtonly off 

/* query body */ 

if @fmtonlyon = 1 set fmtonly on 

Il force l'évaluation complète. Peut-être ou pourrait ne pas fonctionner dans votre situation.

Vous pouvez également remplacer les instructions SELECT de débogage par PRINT.

+0

Réponses: Le jeu de colonnes ne varie pas avec @debug. La base de données est un serveur SQL. Le kludge n'a pas fonctionné malheureusement. –

+0

J'aime l'idée de PRINT, et cela résout ce problème de montrer la valeur de @now. Y a-t-il un moyen de faire la même chose pour une table temporaire? –

+0

Ce serait plus facile si vous publiiez la requête complète, ou quelque chose qui reproduit le problème avec des dépendances minimales afin que nous puissions voir votre intention et reproduire le comportement nous-mêmes. –

0

Vous feriez mieux d'écrire votre requête dans une procédure stockée et d'appeler le sproc de RS au lieu de devoir compter sur l'interprétation de RS de votre requête de texte. Ensuite, vous devriez être en mesure de transmettre votre paramètre @Debug et de le vérifier sans problème.

Modifier: Essayez ceci à la place et voir si elle reconnaît l'instruction If -

-- Used to enable/disable diagnostic statements 
declare @DEBUG bit 
set @DEBUG = 0 

-- Get current date/time. 
declare @now datetime; set @now = getdate() 
IF @DEBUG = 1 
BEGIN 
    select @now as now 
END 
ELSE 
BEGIN 
    select * from ... -- Main query elided 
END 

Edit # 2: Comme ci-dessus ne semble pas aider, ma prochaine suggestion serait de tenter quelque chose comme un SELECT CASE (Cela suppose que vous ne tiriez une colonne et de l'appeler « maintenant »):

-- Used to enable/disable diagnostic statements 
declare @DEBUG bit 
set @DEBUG = 0 

-- Get current date/time. 
declare @now datetime; set @now = getdate() 
SELECT 
    CASE @Debug 
     WHEN 1 THEN @now 
     WHEN 0 THEN (Perform Your Select Inside These Parentheses) 
    END as now 
+0

Hmmm, c'est un rapport personnalisé pour l'un de nos clients. J'hésite à créer quelque chose d'externe au fichier RDL à ce stade. –

+0

Bonne idée, mais ne fonctionne toujours pas - le même problème se produit. –

+0

C'est étrange. J'ai déjà fait des choses comme ça et je n'ai jamais vraiment eu de problèmes. – TheTXI

Questions connexes