【问题标题】:How to get all SSRS Subscription Data using stored procedure?如何使用存储过程获取所有 SSRS 订阅数据?
【发布时间】:2016-04-08 09:01:25
【问题描述】:

我是 ssrs 的新手。

我想获取 ssrs 订阅报告的所有可能数据,这些数据在 ResportServer 数据库中可用。

我找到了一些查询,但没有正确的数据。它仅适用于单个报告。

我需要包含其数据的唯一订阅列表。如果可能,最好使用存储过程。

我的查询:

SELECT
        b.name AS JobName
        , e.name
        , e.path
        , d.description
        , a.SubscriptionID
        , laststatus
        , eventtype
        , LastRunTime
        , date_created
        , date_modified
FROM ReportServer.dbo.ReportSchedule a
JOIN msdb.dbo.sysjobs b
        ON a.ScheduleID = b.name
JOIN ReportServer.dbo.ReportSchedule c
        ON b.name = c.ScheduleID
JOIN ReportServer.dbo.Subscriptions d
        ON c.SubscriptionID = d.SubscriptionID
JOIN ReportServer.dbo.Catalog e
        ON d.report_oid = e.itemid
WHERE e.name = 'Sales_Report'

提前致谢。

【问题讨论】:

    标签: sql sql-server reporting-services


    【解决方案1】:

    我曾经和你现在有同样的要求......

    见下面的存储过程..

    CREATE PROCEDURE [dbo].[GetSubscriptionData]
    AS
    BEGIN
    SET NOCOUNT ON;
    WITH
    [Sub_Parameters] AS
    (
        SELECT  [SubscriptionID], [Parameters] = CONVERT(XML,a.[Parameters])
        FROM [Subscriptions] a
    ),
    [MySubscriptions] AS
    (
        SELECT DISTINCT [SubscriptionID], [ParameterName] = QUOTENAME(p.value('(Name)[1]', 'nvarchar(max)')),   [ParameterValue] = p.value('(Value)[1]', 'nvarchar(max)')
        FROM [Sub_Parameters] a
            CROSS APPLY [Parameters].nodes('/ParameterValues/ParameterValue') t(p)
    ),
    [SubscriptionsAnalysis] AS
    (
        SELECT  a.[SubscriptionID], a.[ParameterName],  [ParameterValue] =  
            (
                SELECT  STUFF((SELECT [ParameterValue] + ', ' as [text()] 
                FROM [MySubscriptions]  
                WHERE   [SubscriptionID] = a.[SubscriptionID]   AND [ParameterName] = a.[ParameterName] 
                    FOR XML PATH('')    ),1, 0, '') +''
            )
        FROM [MySubscriptions] a
        GROUP BY a.[SubscriptionID],a.[ParameterName]
    )
    
    SELECT
    DISTINCT (a.[SubscriptionID]),
    c.[UserName] AS Owner, 
    b.Name,
    b.Path,
    a.[Locale], 
    a.[InactiveFlags], 
    d.[UserName] AS Modified_by, 
    a.[ModifiedDate], 
    a.[Description], 
    a.[LastStatus], 
    a.[EventType], 
    a.[LastRunTime], 
    a.[DeliveryExtension],
    a.[Version],
    sch.StartDate,
    --e.[ParameterName],
    --LEFT(e.[ParameterValue],LEN(e.[ParameterValue])-1) as [ParameterValue],
    SUBSTRING(b.PATH,2,LEN(b.PATH)-(CHARINDEX('/',REVERSE(b.PATH))+1)) AS ProjectName
    FROM 
        [Subscriptions] a 
        INNER JOIN [Catalog] AS b ON a.[Report_OID] = b.[ItemID]
        Inner Join ReportSchedule as RS on rs.SubscriptionID = a.SubscriptionID
        INNER JOIN Schedule AS Sch ON Sch.ScheduleID = rs.ScheduleID
        LEFT OUTER JOIN [Users] AS c ON a.[OwnerID] = c.[UserID]
        LEFT OUTER JOIN [Users] AS d ON a.MODIFIEDBYID = d.Userid
        LEFT OUTER JOIN [SubscriptionsAnalysis] AS e ON a.SubscriptionID = e.SubscriptionID;
    END
    

    这是获取所有 SSRS 订阅的简化查询

    SELECT USR.UserName AS SubscriptionOwner 
      ,SUB.ModifiedDate 
      ,SUB.[Description] 
      ,SUB.EventType 
      ,SUB.DeliveryExtension 
      ,SUB.LastStatus 
      ,SUB.LastRunTime 
      ,SCH.NextRunTime 
      ,SCH.Name AS ScheduleName       
      ,CAT.[Path] AS ReportPath 
      ,CAT.[Description] AS ReportDescription 
    FROM dbo.Subscriptions AS SUB 
     INNER JOIN dbo.Users AS USR 
         ON SUB.OwnerID = USR.UserID 
     INNER JOIN dbo.[Catalog] AS CAT 
         ON SUB.Report_OID = CAT.ItemID 
     INNER JOIN dbo.ReportSchedule AS RS 
         ON SUB.Report_OID = RS.ReportID 
            AND SUB.SubscriptionID = RS.SubscriptionID 
     INNER JOIN dbo.Schedule AS SCH 
         ON RS.ScheduleID = SCH.ScheduleID 
    ORDER BY USR.UserName, CAT.[Path];
    

    如果您还有任何疑问,请发表评论。

    【讨论】:

    • @Bharat 我尝试将它作为查询运行,它带有警告消息,结果集是空列表,没有 itemsMsg 537,级别 16,状态 3,行 3 传递给LEFT 或 SUBSTRING 函数。
    • @JibinMathew:我现在没有订阅 ssrs,我可以回答你,但这需要一些时间,你需要做的是将整个查询分成小块并尝试删除错误部分。 .
    • @Bharat 如果可能的话,请这样做,到时候我也会从我身边进行研究
    • @JibinMathew :我已经更新了我的答案,让我知道您的具体要求是什么?错误仍然相同或有任何更新?
    • @JibinMathew :尝试将表名指定为 reportserver.dbo.Subscriptions 而不是 dbo.Subscriptions。其他表也一样。
    【解决方案2】:

    如果您需要查找 sql server 代理作业,请使用此更新代码

    SET NOCOUNT ON;
    WITH
    [Sub_Parameters] AS
    (
        SELECT  [SubscriptionID], [Parameters] = CONVERT(XML,a.[Parameters])
        FROM [Subscriptions] a
    ),
    [MySubscriptions] AS
    (
        SELECT DISTINCT [SubscriptionID], [ParameterName] = QUOTENAME(p.value('(Name)[1]', 'nvarchar(max)')),   [ParameterValue] = p.value('(Value)[1]', 'nvarchar(max)')
        FROM [Sub_Parameters] a
            CROSS APPLY [Parameters].nodes('/ParameterValues/ParameterValue') t(p)
    ),
    [SubscriptionsAnalysis] AS
    (
        SELECT  a.[SubscriptionID], a.[ParameterName],  [ParameterValue] =  
            (
                SELECT  STUFF((SELECT [ParameterValue] + ', ' as [text()] 
                FROM [MySubscriptions]  
                WHERE   [SubscriptionID] = a.[SubscriptionID]   AND [ParameterName] = a.[ParameterName] 
                    FOR XML PATH('')    ),1, 0, '') +''
            )
        FROM [MySubscriptions] a
        GROUP BY a.[SubscriptionID],a.[ParameterName]
    )
    
    SELECT
        DISTINCT (a.[SubscriptionID]),
        j.name  AS SQLServerAgentJob,
        c.[UserName] AS Owner, 
        b.Name,
        b.Path,
        a.[Locale], 
        a.[InactiveFlags], 
        d.[UserName] AS Modified_by, 
        a.[ModifiedDate], 
        a.[Description], 
        a.[LastStatus], 
        a.[EventType], 
        a.[LastRunTime], 
        a.[DeliveryExtension],
        a.[Version],
        sch.StartDate,
        --e.[ParameterName],
        --LEFT(e.[ParameterValue],LEN(e.[ParameterValue])-1) as [ParameterValue],
        SUBSTRING(b.PATH,2,LEN(b.PATH)-(CHARINDEX('/',REVERSE(b.PATH))+1)) AS ProjectName
    
    FROM [Subscriptions] a 
    INNER JOIN [Catalog] AS b ON a.[Report_OID] = b.[ItemID]
    Inner Join ReportSchedule as RS on rs.SubscriptionID = a.SubscriptionID
    INNER JOIN Schedule AS Sch ON Sch.ScheduleID = rs.ScheduleID
    LEFT OUTER JOIN [Users] AS c ON a.[OwnerID] = c.[UserID]
    LEFT OUTER JOIN [Users] AS d ON a.MODIFIEDBYID = d.Userid
    LEFT OUTER JOIN [SubscriptionsAnalysis] AS e ON a.SubscriptionID = e.SubscriptionID
    LEFT JOIN msdb.dbo.sysobjects so ON rs.ScheduleID= so.name
    INNER JOIN msdb.dbo.sysjobs J ON CONVERT( NVARCHAR(128), RS.ScheduleID ) = J.name
    INNER JOIN msdb.dbo.sysjobschedules JS ON J.job_id = JS.job_id
    

    【讨论】:

      【解决方案3】:

      我正在使用以下查询来获取订阅,然后查找 SQL 作业脚本

      USE ReportServer 
      GO
      
      
      CREATE TABLE #tempReports(LogEntryId BIGINT, subscriptionid VARCHAR(1000),LastRunTime DATETIME,  _Description VARCHAR(1000), ReportID VARCHAR(1000), 
                   LastStatus VARCHAR(1000), rowNum INT)
      INSERT INTO #tempReports
      SELECT *
      FROM 
      (
          SELECT DISTINCT E.LogEntryId, S.subscriptionid, LastRunTime,  S.Description, E.ReportID, S.LastStatus,
                ROW_NUMBER() OVER(PARTITION BY E.ReportID, S.Description ORDER BY S.LastRunTime DESC) as rowNum
          FROM [ExecutionLogStorage]  E
          INNER JOIN Subscriptions S
              ON S.Report_OID = E.ReportID 
          WHERE 1 = 1
          AND (
              S.LastStatus LIKE '%has been saved to the "\\<server>\c$\SSRS_Report_Export\20%'
              )
      )T
      WHERE rowNum = 1
      ORDER BY ReportID, Description
      
      
      CREATE TABLE #ExecutionStatements (ExecStatement VARCHAR(1000), job_name VARCHAR(1000), theReportOrder INT,
                  LogEntryId BIGINT, subscriptionid VARCHAR(1000), LastRunTime DATETIME,  _Description VARCHAR(1000), 
                  ReportID VARCHAR(1000),  LastStatus VARCHAR(1000))
      INSERT INTO #ExecutionStatements
      SELECT 'exec sp_start_job @job_name = ''' + cast(j.name as varchar(40)) + '''' AS ExecStatement,
              j.name AS job_name, 
              ROW_NUMBER () OVER(ORDER BY LogEntryId) AS theReportOrder,
              LogEntryId, subscriptionid,LastRunTime,  _Description, ReportID, 
              LastStatus
      from msdb.dbo.sysjobs j 
      join msdb.dbo.sysjobsteps js 
          on js.job_id = j.job_id        
      join #tempReports s 
          on js.command like '%' + cast(s.subscriptionid as varchar(40)) + '%'
      WHERE 1 = 1
      
      ---Execute required statements in MSDB
      SELECT E.ExecStatement + '--'+ CONVERT(VARCHAR(10),E.theReportOrder), E.theReportOrder, *
      FROM #ExecutionStatements E
      --WHERE subscriptionid = '3AFDAC30-4F30-423F-9F72-7C04C86026AB'
      ORDER BY E.theReportOrder
      
      SELECT DISTINCT S.subscriptionid, S.Description, E.ReportID, S.LastStatus, MAX(LastRunTime)    -- 2021-04-25 18:35:00.840
      FROM [ExecutionLogStorage]  E
      INNER JOIN Subscriptions S
          ON S.Report_OID = E.ReportID 
      WHERE S.subscriptionid = '3AFDAC30-4F30-423F-9F72-7C04C86026AB'
      GROUP BY S.subscriptionid, S.Description, E.ReportID, S.LastStatus
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-19
        • 2019-10-20
        • 2012-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多