使用复杂查询在SSRS中构建动态查询(动态运算符)

时间:2013-05-29 09:50:19

标签: sql reporting-services parameters aggregate-functions

我想使用一些参数(动态运算符)为特定报表构建动态查询。

如何在不编写/编辑表达式的情况下添加动态参数?

因为我的查询很复杂,包括三连接表和聚合,我认为这可能会导致错误。

我可以在数据集属性中的表达式中连接表吗?

SELECT  a.CaseNo, a.PatientName, a.PolicyNumber, 

FROM Cases a

INNER JOIN GOPs b ON a.CaseNo = b.CaseNo

INNER JOIN Invoices d ON d.CaseNo = a.CaseNo 

WHERE (a.CreatedDate >= @StartDate AND a.CreatedDate <= @EndDate +1)

如果我直接在查询编辑器中编写它,此查询是否正常工作。但是,当我把它作为一个表达式不再起作用时。

另外,我想在该查询中添加动态运算符。唯一的解决方案是将其作为表达式。例如。在查询结束时,我想添加以下内容:

AND FeeEuro "+ Parameters!Operator.Value + Parameters!OperatorValue.Value

类似的东西

AND FeeEuro > 200

是否有可能做我需要做的事情,如果是这样,你能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

这里有一些方法。

我创建了一些示例数据来测试:

create table ReportTest
(id int, value int, testDate date)

insert into ReportTest
values
(1, 100, '01-jan-2013'),
(2, 200, '01-feb-2013'),
(3, 300, '01-mar-2013'),
(4, 400, '01-apr-2013')

我还添加了三个参数:

  • Date
  • Operator(我的报告的可用值为<>
  • OperatorValue(整数)

<强>表达式基于

第一个问题是为什么你的查询在编辑器中起作用而不是作为表达式?

您可以在编辑器中引用参数,如果可能,SSRS将根据需要对这些参数进行转换。如您所见,这适用于日期参数,但SSRS不知道如何处理Operator参数。

当使用基于表达式的DataSet时,SSRS根本不会应用任何转换 - 它只会尝试将字符串放在一起,然后将其抛出到数据源并希望它可以工作。这意味着表达式必须应用任何格式化/更新本身来创建适当的查询。

以下表/参数对我有用:

="select * from ReportTest where testDate > '"
  & CDate(Parameters!Date.Value).ToString()
  & "'"
  & " and value " & Parameters!Operator.Value & " " & CStr(Parameters!OperatorValue.Value)

因此,当应用时,它将变为可用的查询,并且可以根据需要运行。

申请时会收到警告:

enter image description here

这是有道理的,因为SSRS无法确定在实际运行动态查询之前会收到什么。

因此,在转移到基于表达式的查询之前,您需要设置列。

<强>编辑器为基础的

在没有动态SQL的情况下应用运算符类型参数很困难,但您可以使用CASE语句执行类似操作。这适用于我通过查询编辑器:

select *
from ReportTest
where testDate > @Date
  and ((@Operator = '>' and value > @OperatorValue)
    or (@Operator = '<' and value < @OperatorValue))

根据您的查看方式,查询稍微复杂一些,但它确实避免了使用基于表达式的查询。

以上两个例子都在我的简单表格中起作用:

enter image description here

当您添加更多复杂性时,这两种方法仍然可行,例如更多的表,聚合,它仍然是相同的原则。