【问题标题】:Build dynamic query(dynamic operator) in SSRS using a complex query使用复杂查询在 SSRS 中构建动态查询(动态运算符)
【发布时间】:2013-05-24 12:36:48
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你能给出一个简化版本的查询以及参数应该如何影响这个查询吗?
  • 我添加了一些样本 Ian。我可以在表达式中使用 INNER JOIN、聚合吗?
  • 酷,谢谢。您能否添加一些示例,说明Parameters!Operator.Value 可能是什么以及这将如何影响最后一行,即AND EWAFeeEuro ...
  • 完整的最后一行应该是这样的:AND FeeEuro > 200

标签: sql reporting-services parameters aggregate-functions


【解决方案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(我的报告中可用值为&lt;&gt;
  • OperatorValue(整数)

基于表达式

第一个问题是为什么您的查询在编辑器中有效,而不是作为表达式?

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

当使用基于表达式的数据集时,SSRS 将完全不应用任何转换 - 它只会尝试将一个字符串放在一起,然后将其扔到数据源并希望它有效。这意味着表达式必须应用任何格式/更新自身来创建适当的查询。

以下表格/参数对我有用:

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

因此,当应用它时,它会变成一个可以根据需要工作的可用查询。

应用这个时你会收到警告:

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

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

基于编辑器

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

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

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

以上两个示例都适用于我的简单表:

随着您增加更多复杂性,这两种方法仍然可行,例如更多的表,聚合,还是一样的原理。

【讨论】:

  • 优秀的方法 Ian 如果您想在没有表达但使用查询编辑器的情况下工作,非常感谢您的建议!!!
猜你喜欢
  • 2021-07-13
  • 1970-01-01
  • 2021-01-17
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2012-11-23
  • 1970-01-01
相关资源
最近更新 更多