我希望你能帮我理解下面这句话。它们是我的SSRS报告中SQL查询的一部分。来自报告构建器 - >报告 - >数据集,我选择了数据集属性 - >查询
以下部分是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是报告中的参数。
答案 0 :(得分: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
语句会放置一个空格而不是上面的部分空格。 (IIF
的第二个参数是一个空格,当IIF
的第一个参数求值为true时返回该空格。如果IIF
的第三个(最后一个)参数返回第一个参数的计算结果为false。
顺便说一下,应该重写此查询以避免p_TEValue
参数上的SQL注入漏洞。如果H_expiry_date
是DATETIME列,我可能会重写以避免日期字符串格式化。