我想使用一些参数(动态运算符)为特定报表构建动态查询。
如何在不编写/编辑表达式的情况下添加动态参数?
因为我的查询很复杂,包括三连接表和聚合,我认为这可能会导致错误。
我可以在数据集属性中的表达式中连接表吗?
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
是否有可能做我需要做的事情,如果是这样,你能指出我正确的方向吗?
答案 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)
因此,当应用时,它将变为可用的查询,并且可以根据需要运行。
申请时会收到警告:
这是有道理的,因为SSRS无法确定在实际运行动态查询之前会收到什么。
因此,在转移到基于表达式的查询之前,您需要设置列。
<强>编辑器为基础的强>
在没有动态SQL的情况下应用运算符类型参数很困难,但您可以使用CASE
语句执行类似操作。这适用于我通过查询编辑器:
select *
from ReportTest
where testDate > @Date
and ((@Operator = '>' and value > @OperatorValue)
or (@Operator = '<' and value < @OperatorValue))
根据您的查看方式,查询稍微复杂一些,但它确实避免了使用基于表达式的查询。
以上两个例子都在我的简单表格中起作用:
当您添加更多复杂性时,这两种方法仍然可行,例如更多的表,聚合,它仍然是相同的原则。