【问题标题】:Query to find list of *all* SSRS DataSets across *all* SSRS reports on ReportServer instance查询以在 ReportServer 实例上的*所有* SSRS 报告中查找*所有* SSRS 数据集列表
【发布时间】:2017-02-08 03:11:22
【问题描述】:

我想在 SSRS 服务器(包括嵌入式数据集)。

另一个不错的功能是能够按报告数据中使用的数据进行过滤(即:绑定到报告正文中的表格等,而不是用作参数下拉列表的数据源)。

【问题讨论】:

    标签: sql-server reporting-services


    【解决方案1】:

    这个似乎更好,因为它可以处理共享和嵌入式数据源...

    http://www.bengribaudo.com/blog/2014/08/07/3278/ssrs-auditing-report-queries

    -- Provided "as is" with no warranties of any kind. User assumes all risks of use.
    /* The XML XQuery statements used below ignore namespace so that information can be retrieved
       from multiple RDL versions. */
    use ReportServer
    ;WITH CatalogWithXml AS (
        -- XMLifyies Catalog's Content column.
        /* For report (Type = 2) and shared data source (Type = 5) objects, the image-typed column
           Content stores the XML RDL defining the object. We convert this column to XML so that SQL's
           XML type's functions can be used on it. */
        SELECT *,
             ContentXml = (CONVERT(XML, CONVERT(VARBINARY(MAX), Content)))
        FROM Catalog
    ),
    
    SharedDataSources AS (
        -- Details on uses of shared data sources.
        -- * Unused data sources are ignored.
        -- * ItemID identifies the catalog entry (e.g. report) using the shared data source. It is not
        --   the data source's ID!
        /* Table DataSource contains a row for each data source (embedded or shared) used in each report.
           Its column Name stores the data source name, as defined in the report. Shared data sources are
           defined (RDL XML) in the catalog. Inner joining between these two tables limits this CTE's
           resultset to details on shared data sources because embedded data sources don't have Link-ed
           rows in the catalog. */
        SELECT ds.ItemID,
            SharedDataSourceName = c.Name,
            LocalDataSourceName = ds.Name,
            DataProvider = ContentXML.value('(/*:DataSourceDefinition/*:Extension)[1]', 'NVARCHAR(260)'),
            ConnectionString = ContentXML.value('(/*:DataSourceDefinition/*:ConnectString)[1]', 'NVARCHAR(MAX)')
        -- Each DataSource row with a Link value represents a use of a shared data source.
        FROM DataSource ds
            -- Uses the Link value to look up the catalog entry defining the shared data source.
            JOIN CatalogWithXml c ON ds.Link = c.ItemID
    ),
    
    AllDataSources AS (
        -- Details on both embedded & shared data sources *used* by reports.
        /* Embedded data sources are defined in the hosting report's RDL. Shared data sources are
           referenced (but not defined) in this RDL. We extract the relevant details and then join
           to the SharedDataSources CTE to assemble a resultset with details on each data source
           (embedded and shared) used by each report (identified by ItemID). */
        SELECT r.ItemID,
            r.LocalDataSourceName, -- embedded data source's name or local name given to shared data source
            sds.SharedDataSourceName,
            SharedDataSource = CAST ((CASE WHEN sds.SharedDataSourceName IS NOT NULL THEN 1 ELSE 0 END) AS BIT),
            DataProvider = ISNULL(r.DataProvider, sds.DataProvider),
            ConnectionString = ISNULL(r.ConnectionString, sds.ConnectionString)
        FROM (
            SELECT c.*,
                    LocalDataSourceName = DataSourceXml.value('@Name', 'NVARCHAR(260)'),
                    DataProvider = DataSourceXml.value('(*:ConnectionProperties/*:DataProvider)[1]', 'NVARCHAR(260)'),
                    ConnectionString = DataSourceXml.value('(*:ConnectionProperties/*:ConnectString)[1]', 'NVARCHAR(MAX)')
                FROM CatalogWithXml c
                    CROSS APPLY ContentXml.nodes('/*:Report/*:DataSources/*:DataSource') DataSource(DataSourceXml)
                WHERE c.Type = 2 -- limit to reports only
            ) r
            LEFT JOIN SharedDataSources sds ON r.ItemID = sds.ItemID AND r.LocalDataSourceName = sds.LocalDataSourceName
    ),
    
    DataSets AS (
        -- Details on data sets used in reports.
        /* Outputs one row per data set used in each report. */
        SELECT ItemID,
            DataSetName = QueryXml.value('@Name', 'NVARCHAR(256)'),
            DataSourceName = QueryXml.value('(*:Query/*:DataSourceName)[1]', 'NVARCHAR(260)'),
            CommandType = QueryXml.value('(*:Query/*:CommandType)[1]', 'NVARCHAR(15)'),
            CommandText = QueryXml.value('(*:Query/*:CommandText)[1]', 'NVARCHAR(MAX)')
        FROM CatalogWithXml
            CROSS APPLY ContentXml.nodes('/*:Report/*:DataSets/*:DataSet') QueryData(QueryXml)
    ),
    
    Data AS (
        -- Combines data set and data source details with additional information from Catalog.
        SELECT ds.ItemID,
            Name,
            Path,  
            LocalDataSourceName,
            SharedDataSource,
            SharedDataSourceName,
            DataProvider,
            ConnectionString,
            DataSetName,
            CommandType = ISNULL(CommandType, 'Text'), -- "Text" = default command type
            CommandText
        FROM DataSets ds
            JOIN AllDataSources src ON src.ItemID = ds.ItemID AND src.LocalDataSourceName = ds.DataSourceName
            JOIN Catalog c ON ds.ItemID = c.ItemID
    )
    SELECT * FROM Data
    

    【讨论】:

      【解决方案2】:

      以下脚本由 Olaf Helper 发布在 Technet 脚本存储库中。

      -- List datasets with command text for all SSRS reports 
      ;WITH  
       XMLNAMESPACES 
           (DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition' 
                   ,'http://schemas.microsoft.com/sqlserver/reporting/reportdesigner' 
            AS rd) 
      ,DEF AS 
          (SELECT RPT.ReportPath 
                 ,R.RptNode.value('(./Query/DataSourceName)[1]', 'nvarchar(425)') AS DataSourceName 
                 ,R.RptNode.value('@Name[1]', 'nvarchar(425)') AS DataSetName 
                 ,REPLACE(REPLACE(LTRIM((R.RptNode.value('(./Query/CommandText)[1]', 'nvarchar(4000)')))  
                          ,'>', '>') 
                          ,'&lt;', '<') 
                  AS CommandText 
           FROM (SELECT RPT.Path AS ReportPath 
                       ,RPT.name AS ReportName 
                       ,CONVERT(xml, CONVERT(varbinary(max), RPT.content)) AS contentXML 
                 FROM ReportServer.dbo.[Catalog] AS RPT 
                 WHERE RPT.Type = 2  -- 2 = Reports 
               ) AS RPT 
           CROSS APPLY RPT.contentXML.nodes('/Report/DataSets/DataSet') AS R(RptNode) 
          ) 
      SELECT DEF.ReportPath 
            ,DEF.DataSourceName 
            ,DEF.DataSetName 
            ,DEF.CommandText 
      FROM DEF 
      -- Optional filter: 
      -- WHERE DEF.CommandText LIKE '%/[Team System/]%' -- MDX query against TFS cube 
      ORDER BY DEF.ReportPath 
              ,DEF.DataSourceName 
              ,DEF.DataSetName
      

      SSRS 2012SSRS 2008 中进行了测试。

      来源可以找到here

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-23
        • 2023-03-07
        • 2017-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        相关资源
        最近更新 更多