我正在创建一个具有多个页面的SSRS来存储相关数据。
来自初始数据集的几个查询正在将一些数据放入我在后续数据集中使用的几个临时表中。
直到前一段时间,当我更改后续查询中的一个以使用报表参数作为日期而不是在查询中创建报表时,报表才能正常运行。
现在,我突然收到有关不存在的临时表的错误。
对数据集“ MEMBER_DATA”的查询执行失败。
无效的对象名称“ #VENDORS”。
我尝试撤消更改,但仍然给我错误(WTF?!?!)。我在报表管理器和Visual Studio中收到错误。
仍选中“使用单个事务”框作为唯一的数据源。我检查了数据库管理员,他们今天对我们的TEST服务器没有做任何事情。
如何使具有多个数据集的临时表再次工作?
答案 0 :(得分:0)
您如何创建临时表? CREATE TABLE #VENDORS ...
?
本地临时表在关闭创建它们的连接时将被删除。它们只有在创建表所用的同一连接上对创建者可见。通常,这意味着在存储过程内创建临时表并尝试在存储过程外访问该表将不起作用。用户断开连接后,将删除本地临时表。即使您已为数据源选中“使用单个事务”,在数据集可以读取临时表或存储过程在不同的连接或用户下执行之前,听起来连接已关闭。
您可以尝试将其创建为全局临时表:CREATE TABLE ##VENDORS ...
。全局临时表对所有用户和创建后的任何连接都是可见的,并且在引用该表的所有用户断开连接时都将删除它们。这可能会使桌子活着足够长的时间,以使读者能够阅读它们。
请注意,这使临时表可供所有用户访问,这可能是不可取的。
答案 1 :(得分:0)
经过(大量)进一步的审查,当您在查询中使用SSRS参数时,似乎SSRS中的#TEMP表使用分崩离析。
我发现我可以使用查询表达式将参数添加到查询文本中。
="SELECT M_ID," & VBCRLF &
" CONVERT(VARCHAR(10), APPT_TIME, 120) AS DOS," & VBCRLF &
" STATUS," & VBCRLF &
" COUNT(*) AS TRANSACTIONS," & VBCRLF &
" CAST(SUM(BILL_FROM_TRIP_COST) AS MONEY) AS ADMIN_FEE," & VBCRLF &
" CAST(SUM(LYFT_TRIP_COST) AS MONEY) AS TRANSPORATION_COST," & VBCRLF &
" CAST(0.00 AS MONEY) AS TOTAL_COST" & VBCRLF &
"INTO #ALC " & VBCRLF &
"FROM DETAILS WITH(NOLOCK)" & VBCRLF &
"WHERE CONVERT(VARCHAR(6), APPT_TIME, 112) <= '" & Parameters!CUTOFF_MONTH.Value & "'" & VBCRLF &
"GROUP BY M_ID," & VBCRLF &
" CONVERT(VARCHAR(10), APPT_TIME, 120)," & VBCRLF &
" STATUS;"
我在任何地方都找不到有关这种限制的文档。如果有人知道任何问题,请随时添加或发布您自己的答案。
答案 2 :(得分:0)
我遇到了同样的问题。我相信当您使用Parameters时,SSRS会将数据集查询封装在一个临时存储过程中。一旦存储过程结束,存储过程中声明的任何临时表都将超出范围。
为解决此问题,我在一个首先运行的单独数据集中声明了临时表。如果您已经创建了数据集,则这需要您修改.RDL文件的XML,但对于新报告来说应该不是问题。
另一种方法是在第一个数据集中创建一个临时表,其中每个字段都引用您的参数。在第二个数据集中,从参数填充临时表。然后,在实际数据集中,查询临时表即可检索参数,而不会出现任何问题。