我有一份关于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个临时表,这些表是提供要转换的数据的表。问题是,对于每个子报表,表都会不断重新创建,这会导致报表需要很长时间才能创建。是否有可用的解决方法可以重用在存储过程开始时创建的表?
答案 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作业,每晚午夜重建工作表。
顺便说一句,您可以在临时表上创建索引,并且应该认真考虑向临时表添加聚簇索引。你可能会发现,即使它是一个很小的表,你也可以在这样的表上运行得更快。表