方案: 我有一个相对庞大的TSQL代码,我需要运行它来填充SSRS报告参数。要删除值字段中的重复项,我必须运行一次代码才能获得一组不同的值。然后,为了获得所有相关的密钥,我不得不再次使用该值运行代码。这实在是效率低下。我希望能够运行一次查询,提示用户选择适当的变量,然后检索所有关联的值,而不必返回数据服务器。
示例:
CREATE TABLE #mydata(
ID INT,
EmployeeName VARCHAR(100),
Dept VARCHAR(100))
INSERT #mydata
VALUES(1,'Jones', 'HR'),
(2,'Smith', 'Finance'),
(3, 'Miller', 'Finance'),
(4, 'Macpherson','HR')
如果我想显示参数列表,以便有人可以选择部门,然后检索相关的ID,我目前正在这样做:
Query1A:
select distinct Dept from #mydata
- 填充参数下拉列表,用户选择存储在@depts参数
中Query2A:
select ID from #mydata where Dept = @depts.
(我需要ID本身,因为这构成了报告中其他级联逻辑的基础)
然而我真正希望能够做的是(其中一些显然是伪代码,试图呈现我想要做的事情,请不要纠正伪代码!!)
Query1B:
select Dept, ID from #mydata
(存储在结果集$ 1B中)
Query2B:
select distinct Dept from $1B
(2B构成参数选择的基础;用户选择的参数存储在@depts中)
Query3B:
select ID from $1B where Dept = @depts
或者
Query1C:
select Dept, ID, rank() over (partition by Dept order by ID) as ranked from #mydata
(存储在结果集$ 1C)
Query2C:
结果集$ 1C由ranked=1
过滤,形成参数选择的基础;用户选择的参数存储在@depts中。
Query3C:
select ID from $1B where Dept = @depts
这似乎是一件相当正常的事情,但我无法找到描述这种需求的任何地方,或者暗示这是MS提供的东西。在我放弃之前,我只想检查其他人是否有这个问题并解决了它!
答案 0 :(得分:0)
你要求的是有道理的,我同意这是一个相对常见的要求。无法从报表本身的一个查询中获取不同列表和完整数据集。虽然有几种方法可以达到这个目的。
第一种方法是在数据库中使用存储结果的表。例如,如果查询由于业务逻辑或聚合而花费很长时间,则使用计划的存储过程定期将结果保存在单独的表中可能是有意义的。然后,当您运行报表时,您只是查询此准备好的数据集。如果由于数据量庞大而导致查询速度很慢,这可能无济于事。
另一个类似的选择是在SSRS中使用共享数据集。这是一种保存查询以便在多个报表中使用的方法。其中一个不错的功能是可以按计划缓存数据。换句话说,该查询将定期自动运行。当您查看报告时,它没有再次访问数据库,它只是检索缓存的数据。
根据数据集的大小以及参数对其的影响,这可能实际上不会使报告更快。在报告运行之前可以平衡可以完成多少工作以及缓存它需要多少存储空间总是需要权衡。但根据你的问题,这肯定是一种方法,你应该试着看看你是否可以让它适合你。