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,类别参数是