SSRS - 在多个数据集中重用临时表

时间:2016-12-16 12:46:58

标签: sql sql-server reporting-services ssrs-2012

我有一份关于SSRS的报告,它有14个子报告。所有这些子报告都从相同的存储过程中读取,但以不同的方式呈现数据(因为计算不同)。我写SP的方式如下:

IF OBJECT_ID('tempdb.dbo.#blabla') IS NOT NULL
    BEGIN DROP TABLE #blabla END
SELECT a,b,c,d,e
INTO #blabla
WHERE a='bla'

IF @type = 1 --report 1
   BEGIN
      SELECT ....
   END
IF @type = 2 --report 2
   BEGIN
      SELECT .....
   END

每个报告等等。

我在存储过程的开头创建了3个临时表,这些表是提供要转换的数据的表。问题是,对于每个子报表,表都会不断重新创建,这会导致报表需要很长时间才能创建。是否有可用的解决方法可以重用在存储过程开始时创建的表?

2 个答案:

答案 0 :(得分:2)

由于您使用的是单独的子报表,因此每个子报表的查询都不会使用临时表所在的同一事务。当查询连接丢失时,SQL Server会删除表。

您可以尝试将所有子报表合并为一个。如果您选中数据源中的<?xml version="1.0" encoding="UTF-8"?> <channels totalcount="0" listend="1"> <prtg-version>16.4.27.6720</prtg-version> <item> <name>Tiempo de inactividad</name> </item> <item> <name>Voltaje Bateria</name> <lastvalue>54,51 VDC</lastvalue> <lastvalue_raw>0000000000054510.0000</lastvalue_raw> </item> </channels> 框,则允许您为每个查询使用#TEMP表。

另一种方法是使用全球临时表 - ## TEMP 。全局临时表不会自动删除,并且可以被其他子报表使用。

答案 1 :(得分:1)

您可以创建另一个表(控制表),其中包含一行,其中包含两列 - 临时表的开始日期和结束日期。当每个报告开始时,它应该根据控制表中的日期检查当前日期。如果日期不是当前重建临时表,否则只是继续处理。如果您要创建将以这种方式共享的临时表,您可能不希望仅创建常规表的临时表。

另一种方法是运行SQL Server作业,每晚午夜重建工作表。

顺便说一句,您可以在临时表上创建索引,并且应该认真考虑向临时表添加聚簇索引。你可能会发现,即使它是一个很小的表,你也可以在这样的表上运行得更快。表