2017-07-27 86 views
1

我在SSRS中创建了一个包含多个数据源的报告。SSRS - 忽略数据库不存在

在极少数情况下,其中一个数据源可能已被分离。最近发生了这种情况,因为SSAS数据库暂时分离在开发服务器上以释放大量工作的内存。 (rsErrorExecutingCommand) 用户'UserName'不能访问'DBName'数据库,或者数据库不存在

是否有修改数据集或数据源中的查询,以便如果查询失败(因为数据库已关闭/分离),它仍然运行其他所有数据,但可能在报告中显示错误。

[编辑]

从布舍尔援助 - 这就是我最终使用:

1)在SQL Server上(应该始终是向上) - 我创建了一个链接服务器的SSAS实例

2)改变我的SSRS数据源指向SQL Server而不是SSAS实例

3)使用此查询(请参阅下文)检查SSAS链接的服务器是否启动 - 我无法使用SSAS进行测试,但它确实有效! (如果有人读这是用同样的方法,你只需要更换我的“SELECT DISTINCT ...等”用自己的查询)

BEGIN TRY 
EXEC sp_testlinkedserver N'SSAS_LinkedServer'; 

EXEC sp_executesql N'SELECT * FROM OPENQUERY(SSAS_LinkedServer, 
     ''SELECT 
    DISTINCT 
     [CATALOG_NAME] as [Database], 
     [CUBE_NAME], 
     DIMENSION_CAPTION AS [Dimension], 
     DIMENSION_CARDINALITY AS [Count] 
    FROM $system.MDSchema_Dimensions 
     ORDER BY DIMENSION_CARDINALITY DESC;'');'; 
END TRY 

BEGIN CATCH 
SELECT 
     '' as [Database], 
     '' as [CUBE_NAME], 
     '' AS [Dimension], 
     '' AS [Count] 
END CATCH 

感谢布舍尔指着我在正确的方向。

+0

您可以在存储过程中构建数据集,然后使用Try/Catch语句从可能分离的数据库中提取数据。如果尝试失败,只需返回任何数据,或只是列标题。 – bushell

回答

2

我会将您的数据集移动到可调用的存储过程中,然后使用TRY/CATCH块来确定选择是否运行没有错误。而在出现错误的情况下,只需返回列标题并且没有行。

BEGIN TRY 
    SELECT * FROM dbo.DetachedDB 
END TRY 

BEGIN CATCH 
    SELECT '' as [Column1], '' as [Column2]; etc.... 
END CATCH; 

然后在你的SSRS报告,如果数据集的行数都是零,切换台的知名度,并给出了可以设置为显示而不是错误消息。

+1

感谢这个Bushell,我可能没有时间在周末之前测试这个,但逻辑对我来说听起来很合理,因此标记为答案 - 不幸的是没有足够的代表upvote,但是非常感谢您的时间和帮助。 – Celador

+0

谢谢,我的例子过于简化了,但是如果在存储过程中正确实施,这个概念将起作用。昨晚我还在想这件事,下面的链接也可能会提供一个替代解决方案。 https://stackoverflow.com/questions/3104186/sql-server-is-there-an-if-exists-test-for-a-linked-server – bushell

+0

再次感谢,我编辑了我的原始问题,以显示我最终使用 - 不幸的是,我无法使用SSAS进行测试 - 但我不明白为什么它不起作用! – Celador