【发布时间】:2016-09-09 14:06:10
【问题描述】:
我在 SSRS 中有一个参数 @Destinataire,它有一个值列表和一个空字符串
我创建了一个设置为可用值的查询,它为我提供了下拉列表
SELECT code_name FROM tableA UNION ALL SELECT ''
使用空字符串运行报告时,我没有结果
我尝试将参数设置为文本框,它也没有做任何事情
但在运行我用来运行此报告的 sql 查询时,一切都很好,因为我检索到了所有行(请参阅下面的查询)
DECLARE @DateCmt DATE = '05/09/2015',
@DateFin DATE = '05/09/2016',
@Restriction INT = 1,
@Destinataire VARCHAR(5) = ''
--
;
--SELECT @DateCmt,@DateFin
SELECT DISTINCT
CFE_EDI.IU_LIASSE
,CFE_EDI.ETAT
,CFE_EDI.DATHRMAJ -- nouveau
,CFE_EDI.ESP_APPLI
,CFE_EDI.NOM_RS
,PARTENAIRES.LIBEL
,PARTENAIRES.CODE_INSEE
,CFE_EDI.DATHR_ENV -- nouveau
,CFE_EDI.DATHR_MEF -- nouveau
,CFE_EDI.DATHR_PRE -- nouveau
,CFE_EDI.DATHR_OUV -- nouveau
--,CFE_EDI.DATEHR_DEPOT-- mettre l'heure
,CFE_EDI.GESTDEL
--,CFE_SERVICE_DEST.IU_DEST
--,CFE_SERVICE.IU_LIASSE
,CASE WHEN CFE_EDI.ETAT = 'MEF' THEN 'En Attente le'
WHEN CFE_EDI.ETAT = 'PRE' THEN 'Préparé le'
WHEN CFE_EDI.ETAT = 'ENV' THEN 'Envoyé le'
WHEN CFE_EDI.ETAT = 'OUV' THEN 'Réceptionné le'
WHEN CFE_EDI.ETAT = 'NRM' THEN 'Non remis le'
WHEN CFE_EDI.ETAT = 'NAQ' THEN 'Non acquitté le'
END AS ChampEtat
,CASE WHEN CFE_EDI.ETAT = 'OUV' THEN 'Date d''envoi : ' + CONVERT(VARCHAR,CFE_EDI.DATHR_ENV,103)
END AS Date_Envoi,
CASE
WHEN CFE_EDI.ETAT='MEF' THEN CONVERT(VARCHAR,CFE_EDI.DATHR_MEF,103)
WHEN CFE_EDI.ETAT='PRE' THEN CONVERT(VARCHAR,CFE_EDI.DATHR_PRE,103)
WHEN CFE_EDI.ETAT='ENV' THEN CONVERT(VARCHAR,CFE_EDI.DATHR_ENV,103)
WHEN CFE_EDI.ETAT='OUV' THEN CONVERT(VARCHAR,CFE_EDI.DATHR_OUV,103)
ELSE CONVERT(VARCHAR,CFE_EDI.DATHR_DEPOT,103) END AS DateMaj ,
CASE
WHEN CFE_EDI.ETAT='MEF' then CONVERT(VARCHAR,CFE_EDI.DATHR_MEF,108)
WHEN CFE_EDI.ETAT='PRE' then CONVERT(VARCHAR,CFE_EDI.DATHR_PRE,108)
WHEN CFE_EDI.ETAT='ENV' then CONVERT(VARCHAR,CFE_EDI.DATHR_ENV,108)
WHEN CFE_EDI.ETAT='OUV' then CONVERT(VARCHAR,CFE_EDI.DATHR_OUV,108)
ELSE CONVERT(VARCHAR,CFE_EDI.DATHR_DEPOT,108) END AS HeureMaj,
PARTENAIRES.LIBEL + '(' + CFE_EDI.CODE_INSEE + ')' AS LibelDestinataire
--,CASE WHEN @Restriction = 1 THEN '1'
-- WHEN @Restriction = 0 THEN '0' END AS Restriction
,CASE WHEN @DateCmt != @DateFin AND @DateCmt < @DateFin THEN 'Diffusion Xml du ' + CONVERT(VARCHAR,(@DateCmt),103) + ' au ' + CONVERT(VARCHAR,(@DateFin),103) ELSE
'Diffusion EDI Xml du ' + CONVERT(VARCHAR,@DateCmt,103) END AS Plage_Diffusion
-- INTO
FROM
(PARTENAIRES
INNER JOIN dbo.CFE_EDI ON PARTENAIRES.CODE_INSEE = CFE_EDI.CODE_INSEE)
INNER JOIN dbo.CFE_SERVICE ON CFE_EDI.IU_LIASSE = CFE_SERVICE.IU_LIASSE
INNER JOIN dbo.CFE_SERVICE_DEST ON (PARTENAIRES.IU_PART = CFE_SERVICE_DEST.IU_PART_CFE)
WHERE
case when @Restriction = 1
then case when CFE_EDI.ETAT in('ENV','OUV') then 1 else 0 end
when @Restriction = 0
then case when CFE_EDI.ETAT not in('ENV','OUV') then 1 else 0 end
else case when CFE_EDI.ETAT <> '' then 1 else 0 end
end = 1
AND
CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE != ''
AND CASE --WHEN CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE !=''
--THEN CASE
WHEN @Destinataire != '' AND (@Destinataire) IS NOT NULL
THEN CASE WHEN CFE_EDI.CODE_INSEE = @Destinataire THEN 1 ELSE 0 END
ELSE CASE WHEN CFE_EDI.CODE_INSEE = PARTENAIRES.CODE_INSEE
AND cfe_edi.dathrmaj > @DateCmt AND cfe_edi.dathrmaj < @DateFin
AND CFE_EDI.GESTDEL = '1' THEN 1 ELSE 0 END
END = 1
第一个问题是知道是否有办法在不使用我的愚蠢技巧的情况下设置参数。
第二个问题是为什么带有空字符串参数的查询会起作用,而一旦使用 SSRS,什么都没有。
提前感谢您的帮助
更新我尝试将WHEN LEN(@Destinataire) > 0 设置为@Destinataire = '',但没有成功。
更新 2 我现在的目标是找到一个可以检索所有数据的解决方案,以防 @Destinataire 等于 '' 或 NULL。然而,仔细想想,这个解决方案相当于在@Destinataire 中填充了所有值。所以我会说一种或另一种方式。
最终更新我从头开始重新创建了所有内容,哦!魔术,分组或一切选项如愿以偿。我仍然不知道出了什么问题,但我对结果很好。非常感谢您的帮助和支持。
【问题讨论】:
-
为什么不传递空字符串,而不是传递其他“空”,然后调整查询或设置查询传递时的案例“空”设置@Destinataire = '' .
-
嗨@newGuy 不,你的建议没有做它应该做的事情
-
嗨@mike-honey,你有机会看看吗?
-
今天晚上醒来时,我有一个洞察力。为什么不使用
len(@Destinataire) > 0?让我星期一试试 -
您可以使用值“ALL”而不是空字符串然后检查您的情况是否有 Destinaire != 'ALL'
标签: sql sql-server reporting-services