【问题标题】:IIF Parameter Embedded inside SSRS SQL Query嵌入在 SSRS SQL 查询中的 IIF 参数
【发布时间】:2017-09-02 06:01:25
【问题描述】:

我希望你能帮助我理解下面的短语。它们是我的 SSRS 报告中 SQL 查询的一部分。从 Report Builder -> Report -> a Dataset,我选择了 Dataset Properties -> Query

下面的部分是WHERE 子句的一部分:它指的是SSRS 参数,我无法理解它们的含义。它们看起来不像我以前使用的简单 IIF 语句,因为它们包含许多符号,例如 "','") & "') " & 。
如果您能通过分解它们来帮助解释其含义,我将不胜感激。

AND PTE_code = '" & Parameters!p_TE.Value & "'") & " 
AND PTY_code IN ('" & Join(Parameters!p_TY.Value,"','") & "') " & Iif(IsNothing(Parameters!pFDate.Value)," "," 
AND (H_expiry_date >= '" & UCase(Format(Parameters!pFDate.Value,"dd-MMM-yyyy")) & "' OR H_expiry_date IS NULL)" ) & Iif(IsNothing(Parameters!pTDate.Value)," "," 
AND (H_expiry_date <= '" & UCase(Format(Parameters!pTDate.Value,"dd-MMM-yyyy")) & "' OR H_expiry_date IS NULL)" ) & iif(Parameters!p_PC.Value="ALL"," "," AND PC = '" & Parameters!p_PC.Value & "' ")

注意事项: PTE_code、PTY_code、H_expiry_date、PC 是表中的字段名称。 p_TE、p_TY、p_FDate、p_TDate、p_PC 是报告中的参数。

【问题讨论】:

    标签: reporting-services parameter-passing iif


    【解决方案1】:

    只要有双引号,SQL 查询字符串就会在 Reporting Services 中组合。单引号作为查询字符串的一部分发送到数据库服务器,分隔字符串:所以这实际上会发送一个查询,例如:

    AND PTE_code = 'p_TEValue' 
    AND PTY_code IN ('p_TYValue1','p_TYValue2') 
    AND (H_expiry_date >= 'pFDateValueFormatted' OR H_expiry_date IS NULL) 
    AND (H_expiry_date <= 'pTDateValueFormatted' OR H_expiry_date IS NULL)
    AND PC = 'p_PCValue'
    

    当某些参数为空时,IIF 语句会放置一个空格而不是上述 where 的一部分。 (IIF 的第二个参数是一个空格,当IIF 的第一个参数计算结果为 true 时返回。如果第一个参数计算结果为 false,则返回 IIF 的第三个(最后一个)参数。

    顺便说一句,应该重写这个查询以避免p_TEValue 参数上的SQL 注入漏洞。如果 H_expiry_date 是 DATETIME 列,我可能会重写以避免日期字符串格式。

    【讨论】:

    • 非常感谢 Jamie 的帮助。我需要重写条件,因为我的用户希望 p_PCValue 参数是多项选择。
    • 我不明白如何结束整个查询,查询以 ="Select ..... 开头,然后以 & iif(Parameters!p_PC.Value="ALL"," " ," AND PC = '" & Parameters!p_PC.Value & "' ") 我需要重写条件的最后一部分,因为我的用户希望将 p_PCValue 参数设为多项选择。我重新编写了 -- --> & iif(Parameters!p_PC.Value="ALL"," "," AND PC = '" & Parameters!p_PC.Value & "'") into ----> AND PC IN ('" & Join (Parameters!p_PC.Value,"','") & "') 然后我收到数据集错误。你能帮忙吗?
    • 这与您的原始问题不同。您应该为此提出一个新问题。 (Stack Overflow 试图让所有答案都与所写的问题相匹配。)此外,投票给有用的答案并接受正确的答案对社区很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    相关资源
    最近更新 更多