我已将600份SSRS报告部署到生产中。如何获取报告的元数据信息?像哪些报告使用哪些表。如果任何报告使用多于一个表,我试图获取报告使用的所有表。
是否可以获得此类信息?请帮帮我
答案 0 :(得分:1)
您可以操作ReportServer.dbo.Catalog中的数据,为每个RDL提取XML。然后,如果所有表都以模式名称开头,则可以对XML(或XML中的数据集查询)执行正则表达式以提取表名称。它可能会变得混乱。如果您不使用两个或三个部分的表名(Database.schema.table或schema.table),则可能很难编写正则表达式。也许有一个工具可以从原始查询中提取表名?在这种情况下,您可以毫不费力地从Catalog表中提取查询。
现在在移动设备上但我可以提供目录表提取查询,如果您认为它有用(我在生产中使用它来搜索表名...不提取所有表名)。
答案 1 :(得分:0)
我必须将'http://schemas.microsoft.com/sqlserver/reporting/ 2016 / 01 / reportdefinition'位更改为SSRS的适当年份,否则结果为0行。
WITH XMLNAMESPACES ( DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition', 'http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' AS rd )
SELECT ReportName = name
,DataSetName = x.value('(@Name)[1]', 'VARCHAR(250)')
,DataSourceName = x.value('(Query/DataSourceName)[1]','VARCHAR(250)')
,CommandText = x.value('(Query/CommandText)[1]','VARCHAR(250)')
,Fields = df.value('(@Name)[1]','VARCHAR(250)')
,DataField = df.value('(DataField)[1]','VARCHAR(250)')
,DataType = df.value('(rd:TypeName)[1]','VARCHAR(250)')
--,ConnectionString = x.value('(ConnectionProperties/ConnectString)[1]','VARCHAR(250)')
FROM ( SELECT C.Name,CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content)) AS reportXML
FROM ReportServer.dbo.Catalog C
WHERE C.Content is not null
AND C.Type = 2
) a
CROSS APPLY reportXML.nodes('/Report/DataSets/DataSet') r ( x )
CROSS APPLY x.nodes('Fields/Field') f(df)
ORDER BY name