我准备了一个相当标准的报告文件(.rdl),其中包含一个由数据集填充的Tablix。数据集由一个相当简单的查询组成,但确实使用WHERE过滤器执行JOIN。
为了便于说明,我们假设数据集查询类似于:
Select FIELD1, FIELD2, FIELD3
From MyView as V
Join MyTable as T on V.FIELD1=T.FIELD1
WHERE ...
我现在需要针对不同的数据集运行相同的报告(布局,数据等)。毫无疑问,我希望第二个数据集必须匹配第一个字段名称,类型等。最初,我希望只使用报表参数更新Tablix上的DataSetName属性,但是我的研究,这似乎不可能。
我尝试使用两种方法参数化我的数据集失败了。
方法1:
Select FIELD1, FIELD2, FIELD3
From @ViewParam as V
Join MyTable as T on V.FIELD1=T.FIELD1
WHERE ...
然后,我将新的@ViewParam绑定到报告参数,其值为dbo.MyView,dbo.MyView2为可用选项。 SSRS Designer并不关心这一点,并且吐出来:“无法更新查询的字段列表。验证您是否可以连接到数据源并且查询语法是否正确。必须声明表变量”@ViewParam “。要继续而不更新字段列表,请单击”确定“。
我点击确定然后继续,但是在预测报告不起作用时并不感到惊讶:“必须声明表变量”@ViewParam“。
方法2:
在“数据集”属性窗口中,在“查询”字段旁边,我选择了“Fx”按钮,并尝试根据我在其他地方找到的提示构建动态表达式。它看起来像这样:
="Select FIELD1, FIELD2, FIELD3 " &
"From " & Parameters!ViewParam.Value & " as V " &
"Join MyTable as T on V.FIELD1=T.FIELD1 " &
"WHERE ... "
在这种情况下,预览报表将返回错误:“处理数据集'MyDataset'的CommandText表达式时出错。”我仔细检查了表达式,看起来是正确的,但是如果没有看到Report Builder实际上是在尝试发送到SQL Server,我只是猜测真正的问题。
这些方法是否可行?如果没有,是否有一些等效和合理的方法可以避免我的项目中有两个几乎重复的.rdl文件?
谢谢!
答案 0 :(得分:0)
您的第二种方法可能是可行的,您可以使用Profiler查看在尝试时实际发送到SQL Server的命令,希望这有助于您调试它。您还需要实际执行您构建的字符串,您不能只将字符串值发送到SQL Server并期望SQL Server知道如何处理它。
但是,这就是我处理你的问题的方法:
而不是数据集属性中的SQL语句,而是调用存储过程。该过程将期望生成WHERE子句所需的所有参数以及ViewParam参数。
在存储过程中,使用以下逻辑:
IF @ViewParam = 'First Option'
SELECT (your first query)
ELSE IF @ViewParam = 'Second Option'
SELECT (your second query)
或者,如果您觉得维护起来更容易,可以使用view参数在存储过程中创建动态sql。
答案 1 :(得分:0)
我认为您需要将查询构建为字符串,如方法2 。
我认为您的查询中的问题是您在 AS V 之后错过了空间:
="Select FIELD1, FIELD2, FIELD3 " &
"From " & Parameters!ViewParam.Value & " as V " &
"Join MyTable as T on V.FIELD1=T.FIELD1 " &
"WHERE ... "
代码最终会以作为VJoin 结束。
您可以使用 VBCRLF 添加换行符:
="Select FIELD1, FIELD2, FIELD3 " & VBCRLF &
"From " & Parameters!ViewParam.Value & " as V " & VBCRLF &
"Join MyTable as T on V.FIELD1=T.FIELD1 " & VBCRLF &
"WHERE ... "