如何通过SQL脚本查询SSRS服务器中RDL文件的报表及数据源信息
提取SSRS报表数据源信息的SQL方案
嘿,我来帮你搞定这个批量提取SSRS报表数据源信息的需求!针对你要找的报表名称、蓝色框的报表内数据源名称,还有绿色框的共享数据源引用,直接查ReportServer的系统表就能搞定,下面是具体的脚本和说明:
核心提取脚本
SELECT -- 报表名称 c.Name AS ReportName, -- 报表里定义的数据源名称(就是你说的蓝色框内容) ds.Name AS ReportDataSourceName, -- 实际用的共享数据源引用(绿色框里的内容) CASE WHEN ds.LinkedItemID IS NOT NULL THEN -- 共享数据源的话,拼出完整路径+名称,方便定位 CONCAT('/', sc.Path, '/', sc.Name) ELSE -- 自定义数据源的话,显示连接字符串做区分 '自定义数据源: ' + dsc.ConnectString END AS ActualDataSourceReference FROM Catalog c INNER JOIN DataSource ds ON c.ItemID = ds.ItemID LEFT JOIN Catalog sc ON ds.LinkedItemID = sc.ItemID LEFT JOIN DataSourceContents dsc ON ds.DataSourceID = dsc.DataSourceID WHERE -- 只筛选报表类型(SSRS里Type=2代表报表) c.Type = 2 ORDER BY ReportName, ReportDataSourceName;
脚本细节说明
- ReportName:直接取Catalog表里的报表名称,就是你服务器上显示的报表名。
- ReportDataSourceName:对应DataSource表的Name字段,就是每个报表里自己定义的数据源名称(蓝色框的内容)。
- ActualDataSourceReference:
- 如果是共享数据源,会把该共享数据源的完整路径和名称拼出来,完全对应绿色框里的引用;
- 如果是自定义数据源,会标注出来并显示连接字符串,避免和共享数据源混淆。
处理重复报表的辅助脚本
因为你提到有大量重复名称的报表要清理,这个脚本可以帮你快速定位重复项:
-- 找出所有名称重复的报表,以及它们的ID SELECT ReportName, COUNT(*) AS 重复数量, STRING_AGG(ItemID, ', ') AS 报表ID列表 FROM ( SELECT c.Name AS ReportName, c.ItemID FROM Catalog c WHERE c.Type = 2 ) t GROUP BY ReportName HAVING COUNT(*) > 1 ORDER BY 重复数量 DESC;
拿到这些重复报表的ID后,你可以结合上面的核心脚本,查看它们的数据源使用情况,判断哪些是冗余的可以删除的报表。
内容的提问来源于stack exchange,提问作者Elizabeth
相关产品推荐
相关产品推荐

