【问题标题】:Creating an SSRS Report about the reports on the Report Server创建关于报告服务器上报告的 SSRS 报告
【发布时间】:2017-09-17 05:20:15
【问题描述】:

我正在使用 SQL-Server 2014 创建一个 SSRS 报告(用于文档目的),其中包含我们在报告服务器上拥有的所有报告。我在网上找到了可以帮助我做到这一点的代码。

请看:http://www.sqlservercentral.com/articles/Reporting+Services+(SSRS)/152814/?utm_source=SSC&utm_medium=pubemail

代码如下:

BEGIN TRY
DROP TABLE #ReportList
END TRY
BEGIN CATCH
END CATCH

BEGIN TRY
DROP TABLE #ReportParameters
END TRY
BEGIN CATCH
END CATCH

BEGIN TRY
DROP TABLE #ReportFields
END TRY
BEGIN CATCH
END CATCH

SELECT 
Name
,Path
INTO #ReportList
FROM ReportServer.dbo.Catalog 
WHERE Content IS NOT NULL
ORDER BY Name;

 SELECT DISTINCT Name as ReportName
,ParameterName = Paravalue.value('Name[1]', 'VARCHAR(250)') 
  ,ParameterType = Paravalue.value('Type[1]', 'VARCHAR(250)') 
  ,ISNullable = Paravalue.value('Nullable[1]', 'VARCHAR(250)') 
  ,ISAllowBlank = Paravalue.value('AllowBlank[1]', 'VARCHAR(250)') 
  ,ISMultiValue = Paravalue.value('MultiValue[1]', 'VARCHAR(250)') 
  ,ISUsedInQuery = Paravalue.value('UsedInQuery[1]', 'VARCHAR(250)') 
  ,ParameterPrompt = Paravalue.value('Prompt[1]', 'VARCHAR(250)') 
  ,DynamicPrompt = Paravalue.value('DynamicPrompt[1]', 'VARCHAR(250)') 
  ,PromptUser = Paravalue.value('PromptUser[1]', 'VARCHAR(250)') 
  ,State = Paravalue.value('State[1]', 'VARCHAR(250)') 
INTO #ReportParameters
 FROM (  
SELECT top 1000 C.Name,CONVERT(XML,C.Parameter) AS ParameterXML
FROM  ReportServer.dbo.Catalog C
WHERE  C.Content is not null
AND  C.Type  = 2
 ) a
CROSS APPLY ParameterXML.nodes('//Parameters/Parameter') p ( Paravalue )
ORDER BY ReportName,ParameterName;

WITH XMLNAMESPACES ( DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition', 'http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' AS rd )
SELECT DISTINCT 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)')
INTO #ReportFields
 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 

SELECT 
a.Name AS ReportName
,a.Path
,SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)) AS ReportFolder
,'http://msl-db12/Reports/Pages/Report.aspx?ItemPath='+REPLACE(SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)),'/','%2f')+REPLACE(a.Name,' ','+') AS ReportLink
,'User Input' AS FieldType
,b.ParameterPrompt AS DataSetOrPromptName
,b.ParameterName AS FieldOrParameterName
FROM #ReportList a
LEFT OUTER JOIN #ReportParameters b ON a.Name = b.ReportName
WHERE b.ParameterName IS NOT NULL
UNION
SELECT 
a.Name AS ReportName
,a.Path
,SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)) AS ReportFolder
,'http://msl-db12/Reports/Pages/Report.aspx?ItemPath='+REPLACE(SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)),'/','%2f')+REPLACE(a.Name,' ','+') AS ReportLink
,'Data Point' AS FieldType
,b.DataSetName AS DataSetOrPromptName
,b.Fields AS FieldOrParameterName
FROM #ReportList a
LEFT OUTER JOIN #ReportFields b ON a.Name = b.ReportName
WHERE b.Fields IS NOT NULL
ORDER BY Name,Path,FieldType,ParameterPrompt,ParameterName

这段代码效果很好,我得到了一份关于我的报告服务器上所有报告的不错的报告。

如何加入订阅表以获取每个报告的订阅列?

我添加了以下代码,但效果不佳:

WITH XMLNAMESPACES ( DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition', 'http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' AS rd )
SELECT 
    DISTINCT 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)'
    -------------------------Added this section here.
    ,S.[OwnerID]
    ,S.[Description]
    ,S.LastStatus)
    -------------------------End of the section here.    
INTO #ReportFields

FROM (  SELECT   C.Name
        ,CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content)) AS reportXML
    -------------------------Added this section here.
        ,S.[OwnerID]
        ,S.[Description]
        ,S.LastStatus
    -------------------------End of the section here.
        FROM [GEB_ReportServer].[dbo].[Catalog] C
    -------------------------And this section here.     
            INNER JOIN [GEB_ReportServer].[dbo].[Subscriptions] S ON C.ItemID = S.Report_OID
    -------------------------
        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 

我尝试了以下建议答案中的代码,但运行后,我收到一条错误消息:

消息 208,级别 16,状态 0,第 77 行。无效的对象名称“#ReportParameters”。

所以,我取消了 -- INTO #ReportParameters 的注释,我让报告运行没有错误,但它没有提供订阅表中的任何字段。

【问题讨论】:

    标签: reporting-services sql-server-2014


    【解决方案1】:

    我能够让它与下面的代码一起工作。这可能会帮助你。您使用的别名看起来需要调整。容易错过,容易修复。 :)

    SELECT DISTINCT Name as ReportName
    ,ParameterName = Paravalue.value('Name[1]', 'VARCHAR(250)') 
      ,ParameterType = Paravalue.value('Type[1]', 'VARCHAR(250)') 
      ,ISNullable = Paravalue.value('Nullable[1]', 'VARCHAR(250)') 
      ,ISAllowBlank = Paravalue.value('AllowBlank[1]', 'VARCHAR(250)') 
      ,ISMultiValue = Paravalue.value('MultiValue[1]', 'VARCHAR(250)') 
      ,ISUsedInQuery = Paravalue.value('UsedInQuery[1]', 'VARCHAR(250)') 
      ,ParameterPrompt = Paravalue.value('Prompt[1]', 'VARCHAR(250)') 
      ,DynamicPrompt = Paravalue.value('DynamicPrompt[1]', 'VARCHAR(250)') 
      ,PromptUser = Paravalue.value('PromptUser[1]', 'VARCHAR(250)') 
      ,State = Paravalue.value('State[1]', 'VARCHAR(250)') 
    
        ,a.[OwnerID]
        ,a.[Description]
        ,a.LastStatus
    -- INTO #ReportParameters
     FROM (  
    SELECT top 1000 C.Name,CONVERT(XML,C.Parameter) AS ParameterXML
    ,S.[OwnerID]
    ,S.[Description]
    ,S.LastStatus
    FROM dbo.Catalog C 
                LEFT JOIN [dbo].[Subscriptions] S ON C.ItemID = S.Report_OID
    WHERE  C.Content is not null
    AND  C.Type  = 2
     ) a
    CROSS APPLY ParameterXML.nodes('//Parameters/Parameter') p ( Paravalue )
    ORDER BY ReportName,ParameterName;
    

    编辑:

    下面的完整解决方案

    SELECT 
    C.Name
    ,C.Path
    ,S.[OwnerID]
    ,S.[Description]
    ,S.LastStatus
    INTO #ReportList
    FROM dbo.Catalog C LEFT JOIN [dbo].[Subscriptions] S ON C.ItemID = S.Report_OID
    WHERE Content IS NOT NULL
    ORDER BY Name;
    
     SELECT DISTINCT Name as ReportName
    ,ParameterName = Paravalue.value('Name[1]', 'VARCHAR(250)') 
      ,ParameterType = Paravalue.value('Type[1]', 'VARCHAR(250)') 
      ,ISNullable = Paravalue.value('Nullable[1]', 'VARCHAR(250)') 
      ,ISAllowBlank = Paravalue.value('AllowBlank[1]', 'VARCHAR(250)') 
      ,ISMultiValue = Paravalue.value('MultiValue[1]', 'VARCHAR(250)') 
      ,ISUsedInQuery = Paravalue.value('UsedInQuery[1]', 'VARCHAR(250)') 
      ,ParameterPrompt = Paravalue.value('Prompt[1]', 'VARCHAR(250)') 
      ,DynamicPrompt = Paravalue.value('DynamicPrompt[1]', 'VARCHAR(250)') 
      ,PromptUser = Paravalue.value('PromptUser[1]', 'VARCHAR(250)') 
      ,State = Paravalue.value('State[1]', 'VARCHAR(250)') 
    INTO #ReportParameters
     FROM (  
    SELECT top 1000 C.Name,CONVERT(XML,C.Parameter) AS ParameterXML
    
    FROM  dbo.Catalog C
    WHERE  C.Content is not null
    AND  C.Type  = 2
     ) a
    CROSS APPLY ParameterXML.nodes('//Parameters/Parameter') p ( Paravalue )
    ORDER BY ReportName,ParameterName;
    
    WITH XMLNAMESPACES ( DEFAULT 'http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition', 'http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' AS rd )
    SELECT DISTINCT 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)')
    
    INTO #ReportFields
     FROM ( SELECT C.Name,CONVERT(XML,CONVERT(VARBINARY(MAX),C.Content)) AS reportXML
          FROM 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 
    
    SELECT 
    a.Name AS ReportName
    ,a.Path
    ,a.[OwnerID]
    ,a.[Description]
    ,a.LastStatus
    ,SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)) AS ReportFolder
    ,'http://msl-db12/Reports/Pages/Report.aspx?ItemPath='+REPLACE(SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)),'/','%2f')+REPLACE(a.Name,' ','+') AS ReportLink
    ,'User Input' AS FieldType
    ,b.ParameterPrompt AS DataSetOrPromptName
    ,b.ParameterName AS FieldOrParameterName
    FROM #ReportList a
    LEFT OUTER JOIN #ReportParameters b ON a.Name = b.ReportName
    WHERE b.ParameterName IS NOT NULL
    UNION
    SELECT 
    a.Name AS ReportName
    ,a.Path
    ,a.[OwnerID]
    ,a.[Description]
    ,a.LastStatus
    ,SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)) AS ReportFolder
    ,'http://msl-db12/Reports/Pages/Report.aspx?ItemPath='+REPLACE(SUBSTRING(a.Path,1,LEN(a.Path)-LEN(a.Name)),'/','%2f')+REPLACE(a.Name,' ','+') AS ReportLink
    ,'Data Point' AS FieldType
    ,b.DataSetName AS DataSetOrPromptName
    ,b.Fields AS FieldOrParameterName
    FROM #ReportList a
    LEFT OUTER JOIN #ReportFields b ON a.Name = b.ReportName
    WHERE b.Fields IS NOT NULL
    ORDER BY Name,Path,FieldType,ParameterPrompt,ParameterName
    
    
    DROP TABLE #ReportList
    DROP TABLE #ReportParameters
    DROP TABLE #ReportFields
    

    【讨论】:

    • 当它开始运行并开始显示记录列表时,我非常高兴。但运行后,我收到一条错误消息:Msg 208, Level 16, State 0, Line 77. Invalid object name '#ReportParameters'。请问你能帮忙解决吗?如此接近完成此报告。_______>>> 您的代码注释掉了 -- INTO #ReportParameters 行.......我取消了它的注释,我让报告运行了。这是解决方案吗?
    • 我会说,如果这现在有效,那么它就是解决方案。我评论了INTO #ReportParameters,所以我至少可以测试我发布的内容。如果您在整个代码集中需要它,那么我认为您应该很好。
    • 它可以正常工作而不会给我一个错误但是我没有得到任何订阅表字段。所以,不,它真的不起作用。不过,我非常感谢您提供的帮助。
    • 我用完整的解决方案更新了答案。我刚刚对我的 SSRS DB 运行了这个,它似乎运行良好。我希望它符合您的期望。
    • 那真是太棒了!那确实奏效了。但是,只有一个问题。 OwnerID 基本上是一个 ID。我希望我可以加入用户表 ON OwnerID = Users.UserID 并在结果中显示 Users.UserName。___ 但到目前为止,您已经帮了很大的忙。非常非常感谢!!!
    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多