Sql 将仅使用用户选择的值填充

Sql 将仅使用用户选择的值填充,sql,sql-server,reporting-services,Sql,Sql Server,Reporting Services,在这种情况下,您必须在运算符中使用,因为您的参数表示用户选择或不选择的多个值 ... WHERE CFE_EDI.CODE_INSEE IN (@Destinataire) ... 当您使用默认值属性时,默认情况下会选择所有下拉列表值,并且您的报告运行时不会应用任何筛选器(至少在用户未选择任何值的情况下) 另外,我要避免使用'(空白),它是非信息性的,您的用户可能会认为这是某种错误,或者您的参数没有正确填充 当您希望显示来自多个值(在您的示例中为all)的数据时,为什么要使用单值参数 单值选

在这种情况下,您必须在运算符中使用
,因为您的参数表示用户选择或不选择的多个值

...
WHERE CFE_EDI.CODE_INSEE IN (@Destinataire)
...
当您使用
默认值
属性时,默认情况下会选择所有下拉列表值,并且您的报告运行时不会应用任何筛选器(至少在用户未选择任何值的情况下)

另外,我要避免使用
'
(空白),它是非信息性的,您的用户可能会认为这是某种错误,或者您的参数没有正确填充

当您希望显示来自多个值(在您的示例中为all)的数据时,为什么要使用单值参数

单值选项(无意义IMO)

为此,您必须将参数设置为
允许空白值(“”)
允许空值(
)。您的查询应如下所示:

WHERE
  CASE WHEN @Destinataire = '' OR @Destinataire is null THEN 1 ELSE 0 END = 1
  OR
  CFE_EDI.CODE_INSEE = @Destinataire
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 = '' 
                       OR @Destinataire IS NULL ) 
                    AND 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 = 1 
              OR cfe_edi.code_insee = @Destinataire )  
CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE != '' 
AND CFE_EDI.CODE_INSEE IN (@MultiDestinataire)
...
在你的提问中,我认为可能是这样的:

WHERE
  CASE WHEN @Destinataire = '' OR @Destinataire is null THEN 1 ELSE 0 END = 1
  OR
  CFE_EDI.CODE_INSEE = @Destinataire
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 = '' 
                       OR @Destinataire IS NULL ) 
                    AND 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 = 1 
              OR cfe_edi.code_insee = @Destinataire )  
CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE != '' 
AND CFE_EDI.CODE_INSEE IN (@MultiDestinataire)
...
WHERE CASE
当@Restriction=1时,则
案例
当cfe_edi.etat在('ENV','OUV')中时,则1
其他0
结束
当@Restriction=0时,则
案例
当cfe_edi.etat不在('ENV','OUV')中时,则1
其他0
结束
其他的
案例
当cfe_edi.etat“”时,则1
其他0
结束
结束=1
并且cfe_edi.code_insee不为空
和cfe_edi.code_insee!=''
及(个案)
--当CFE_EDI.CODE_INSEE不为空且CFE_EDI.CODE_INSEE!=''时
--那么情况呢
当(@Destinataire=''时
或@Destinataire为空)
和cfe_edi.code_insee=partenaires.code_insee
和cfe_edi.dathrmaj>@DateCmt
和cfe_edi.dathrmaj<@DateFin
cfe_edi.gestdel='1'然后是1
其他0
结束=1
或cfe_edi.code_insee=@Destinataire)

也可以考虑这个评价<代码>和CFEIDE.CODENIONSE= PARTENAIRES.CODEYIN见,即使您的<代码>连接< /代码>操作符是否强制满足条件?code>PARTENAIRES上的内部连接dbo.CFE\u EDI.code\u INSEE=CFE\u EDI.code\u INSEE

第三个选项可以是使用隐藏参数来清除用户的
null
'
选项,以生成一个填充了所有值的参数。在使用隐藏/内部参数方法之前,请尝试上述选项


让我知道这是否有帮助

有一个混合选项,您可以将可见参数保持原样,然后使用隐藏的级联参数在查询中引用。因此,如果您在使用空值或空值作为参数来表示查询时确实遇到问题,那么这将解决这个问题。以下是步骤:

  • 创建一个新的数据集
需要注意的是,您确实需要确保更改选择时始终添加新值以强制刷新级联参数,但这很容易做到:

SELECT code_name FROM tableA WHERE @Destinataire='' OR @Destinataire=code_name
--Dummy value needed to force update of parameter value in some cases:
UNION SELECT 'zz' + @Destinataire AS code_name
  • 设置一个新参数,
    @MultiDestataire
    。允许它接受多个值,并将新数据集用作其可用值和默认值。将其可见性设置为“隐藏”
在隐藏新参数之前运行报告将显示其工作原理:

  • 编辑查询以在其
    WHERE
    子句中使用新的多值参数
从这里开始,这只是修改查询以使用语句中的
,它应该如下所示:

WHERE
  CASE WHEN @Destinataire = '' OR @Destinataire is null THEN 1 ELSE 0 END = 1
  OR
  CFE_EDI.CODE_INSEE = @Destinataire
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 = '' 
                       OR @Destinataire IS NULL ) 
                    AND 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 = 1 
              OR cfe_edi.code_insee = @Destinataire )  
CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE != '' 
AND CFE_EDI.CODE_INSEE IN (@MultiDestinataire)
...

如果查询中存在导致意外结果的其他问题,则尝试此操作可能最终成为一个中间步骤,因为应该能够在那里测试空值。

与其传递空字符串,不如传递其他“空”值然后调整你的查询,或者设置一个查询通过时的情况“空”set@Destinataire=''。嗨@newGuy不,你的建议没有达到它应该达到的目的。嗨@mike honey,你有没有机会看一看?我今天晚上醒来时有了一个想法。为什么不使用
len(@Destinataire)>0
?让我周一试试,你能使用值“ALL”而不是空字符串,然后在你的案例中检查Destinaire!='ALL'Hi@Zi0n1您建议的空值解决方案也不起作用。。。我想我不明白为什么它也是一个像“我想如果你甚至把它换成一个单独的空间,它就是”这样的空白,那么你可能会看到一个积极的结果。现在,您可能正在丢弃SSR,因为您没有真正传递任何类型的值。我甚至将参数更改为包含
All
,然后将查询更改为在@Destinataire!=''时具有条件
并且(@Destinataire)不为NULL且@Destinataire!='所有“
”。即使这样,什么也没有出现!!!我想我现在明白了。因此,目前您的destinataire参数必须满足所有这些条件才能满足案例陈述的后半部分。尝试将这些AND改为OR,并将它们放在周围,如下所示:(当Destinataire!=''或(Destinataire)不为NULL或Destinataire!='all')我尝试使用括号,然后是AND和OR,每次,我都会面对无结果…嗨@alejandro zuleta,谢谢你的回复。让我们一步一步来。在案例
中重写
没有帮助。我想说的是
类别
,你的意思是
目的地
?我想在
操作符中使用
,但如果我这样做,那么(@Destinataire=''或@Destinataire为NULL)时的
选项将没有意义,对吗?我觉得任何反馈都是非常受欢迎的mired@AndyK,类别参数是