如何查询SQL Server Report Server Catalog中报表关联的数据集信息
SSRS指定文件夹下列出所有报表及关联数据集的操作方案
方案1:查询ReportServer元数据库(推荐,操作最快)
SSRS的所有报表、数据集元数据默认存储在部署时配置的ReportServer数据库中,直接运行SQL查询即可拿到所需数据:
- 先替换查询语句中的
@TargetFolderPath参数值为你要查询的文件夹路径,格式示例:/业务报表/销售模块 - 在SSMS中连接到SSRS对应的SQL Server实例,运行如下查询:
-- 定义目标文件夹路径,开头需带/,结尾不要带/ DECLARE @TargetFolderPath NVARCHAR(260) = '/替换为你的目标文件夹路径'; -- 2016及以上版本SSRS用这个命名空间,2012及更早版本替换为 http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition') SELECT c.Path AS 报表完整路径, c.Name AS 报表名称, ISNULL(dsref.value('(@SharedDataSetReference)[1]', 'NVARCHAR(260)'), '嵌入式数据集') AS 关联共享数据集路径 FROM [ReportServer].[dbo].[Catalog] c CROSS APPLY c.Content.nodes('/Report/DataSets/DataSet/SharedDataSet') AS T(dsref) WHERE c.Type = 2 -- Type=2对应报表类型的资源 AND c.Path LIKE @TargetFolderPath + '/%' -- 仅筛选目标文件夹下的报表,删除该行可查全实例所有报表 ORDER BY c.Path;
返回结果说明:
- 关联共享数据集路径显示为嵌入式数据集的条目,代表该数据集是写在报表内部的私有数据集,不是共享数据集
- 对关联共享数据集路径列去重后,即可得到当前文件夹下所有正在被使用的共享数据集清单
方案2:调用SSRS原生API(适合自动化运维场景)
如果你需要把该能力集成到自研运维工具中,可以调用SSRS的ReportService2010 SOAP接口:
- 先用
ListChildren方法遍历指定文件夹下的所有Type=2的资源(即报表) - 再对每个报表调用
GetItemReferences方法,参数指定引用类型为DataSet,即可拿到该报表关联的所有共享数据集
扩展:批量排查闲置共享数据集
如果要筛选出完全没有被使用的闲置共享数据集,可按以下步骤操作:
- 运行上述查询,删除路径筛选条件,得到全实例所有报表用到的共享数据集清单,去重后得到「在用共享数据集列表」
- 运行如下查询得到全实例所有已部署的共享数据集清单:
SELECT Path AS 共享数据集路径, Name AS 共享数据集名称 FROM [ReportServer].[dbo].[Catalog] WHERE Type = 8 -- Type=8对应共享数据集类型
- 两个清单做差集,得到的就是没有被任何报表引用的闲置共享数据集
注意事项
- 运行SQL的账号需要拥有
ReportServer数据库的只读权限 - 不要直接修改
ReportServer数据库的任何数据,仅做查询操作即可,避免SSRS运行异常
内容的提问来源于stack exchange,提问作者sirpadk
相关产品推荐
相关产品推荐

