3

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

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

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

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

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

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

4

1 回答 1

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参数。

当使用基于表达式的数据集时,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))

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

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

在此处输入图像描述

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

于 2013-05-29T16:51:46.523 回答