sql - 有没有办法查询将来的SSRS订阅时间表?

标签 sql reporting-services subscriptions

在我的办公室中,我们许多人使用SSRS安排定期报告。我想查看接下来几天或一周内即将运行的报告的时间表,以便我们可以查看是否有20个报告都将尝试同时运行。我该怎么做?我创建了显示订阅信息的t-sql报告,但它们仅显示“上次运行”的日期和时间。这对于预测明天的瓶颈没有帮助。该解决方案也应包括数据驱动的订阅。

最佳答案

SSRS将其所有数据存储在ReportServer数据库中,因此您将需要一个对该数据库具有读取访问权限的帐户。这与以纯模式运行的SSRS有关。我也不确定共享时间表或数据驱动的订阅是否将由此代码处理,但我很确定它们会得到处理。我只是没有测试他们。

请注意: Microsoft does not recommend or support directly querying the ReportServer database.他们可能会在下一版本或更新的SSRS中更改结构,并且您可能不会收到任何警告。 Microsoft建议在需要询问有关报告服务的信息时始终使用SSRS web service

这些是与拉出订阅信息相关的表:

  • dbo.Catalog-有关已部署报告
  • 的信息
  • dbo.ReportSchedule-有关报告与时间表和时间表的信息
  • dbo.Subscriptions-有关订阅的信息
  • dbo.Schedule-有关日程表
  • 的信息

    下面的SQL提取所有报告的计划间隔信息。它不会计算下一个运行日期,但可以通过计算出计划运行的时间间隔,可以编写另一个查询来生成实际日期。

    该SQL最初是为报表编写的,该报表仅显示描述间隔的字符串,因此最终输出可能不是您想要的。尽管它确实可以找出所有间隔细节,但它应该为您提供一个良好的起点。
    --these CTEs are used to match the bitmask fields in the schedule to determine which days & months the schedule is triggered on
    WITH wkdays AS (
        SELECT 'Sunday' AS label, 1 AS daybit
        UNION ALL
        SELECT 'Monday', 2
        UNION ALL
        SELECT 'Tuesday', 4
        UNION ALL
        SELECT 'Wednesday', 8
        UNION ALL
        SELECT 'Thursday', 16
        UNION ALL
        SELECT 'Friday', 32
        UNION ALL
        SELECT 'Saturday', 64
    ),
    monthdays AS (
        SELECT CAST(number AS VARCHAR(2)) AS label,
            POWER(CAST(2 AS BIGINT),number-1) AS daybit
        FROM master.dbo.spt_values
        WHERE type='P' AND number BETWEEN 1 AND 31
    ),
    months AS (
        SELECT DATENAME(MM,DATEADD(MM,number-1,0)) AS label,
            POWER(CAST(2 AS BIGINT),number-1) AS mnthbit
        FROM master.dbo.spt_values
        WHERE type='P' AND number BETWEEN 1 AND 12
    )
    SELECT cat.path,
        cat.name,
        cat.creationdate,
        cat.modifieddate,
        subs.Description,
        subs.LastStatus,
        subs.LastRunTime,
        subs.InactiveFlags,
        CASE RecurrenceType
            WHEN 1 THEN 'Once'
            WHEN 2 THEN 'Hourly'
            WHEN 3 THEN 'Daily' --by interval
            WHEN 4 THEN
                CASE
                    WHEN WeeksInterval>1 THEN 'Weekly'
                    ELSE 'Daily' --by day of week
                END
            WHEN 5 THEN 'Monthly' --by calendar day
            WHEN 6 THEN 'Monthly' --by day of week
        END AS sched_type,
        sched.StartDate,
        sched.MinutesInterval,
        sched.RecurrenceType,
        sched.DaysInterval,
        sched.WeeksInterval,
        sched.MonthlyWeek,
        wkdays.label AS wkday,wkdays.daybit AS wkdaybit,
        monthdays.label AS mnthday,monthdays.daybit AS mnthdaybit,
        months.label AS mnth, months.mnthbit
    INTO #t
    FROM dbo.Catalog AS cat
    LEFT JOIN dbo.ReportSchedule AS repsched ON repsched.ReportID=cat.ItemID
    LEFT JOIN dbo.Subscriptions AS subs ON subs.SubscriptionID=repsched.SubscriptionID
    LEFT JOIN dbo.Schedule AS sched ON sched.ScheduleID=repsched.ScheduleID
    LEFT JOIN wkdays ON wkdays.daybit & sched.DaysOfWeek > 0
    LEFT JOIN monthdays ON monthdays.daybit & sched.DaysOfMonth > 0
    LEFT JOIN months ON months.mnthbit & sched.[Month] > 0
    WHERE cat.ParentID IS NOT NULL --all reports have a ParentID
    
    
    /* THE PREVIOUS QUERY LEAVES MULTIPLE ROWS FOR SUBSCRIPTIONS THAT HAVE MULTIPLE BITMASK MATCHES      *
     * THIS QUERY WILL CONCAT ALL OF THOSE FIELDS TOGETHER AND ACCUMULATE THEM IN A TABLE FOR USE LATER. */
    
    CREATE TABLE #c (type VARCHAR(16) COLLATE Latin1_General_CI_AS_KS_WS, name VARCHAR(255) COLLATE Latin1_General_CI_AS_KS_WS, path VARCHAR(255) COLLATE Latin1_General_CI_AS_KS_WS, concatStr VARCHAR(2000) COLLATE Latin1_General_CI_AS_KS_WS);
    
    
    WITH d AS (
        SELECT DISTINCT path,
            name,
            mnthday AS lbl,
            mnthdaybit AS bm
        FROM #t
    )
    INSERT INTO #c (type,path,name,concatStr)
    SELECT 'monthday' AS type,
        t1.path,t1.name,
        STUFF((
            SELECT ', ' + CAST(lbl AS VARCHAR(MAX))
            FROM d AS t2
            WHERE t2.path=t1.path AND t2.name=t1.name
            ORDER BY bm
            FOR XML PATH(''),TYPE
        ).value('.','VARCHAR(MAX)'),1,2,'') AS concatStr
    FROM d AS t1
    GROUP BY t1.path,t1.name;
    
    WITH d AS (
        SELECT DISTINCT path,
            name,
            wkday AS lbl,
            wkdaybit AS bm
        FROM #t
    )
    INSERT INTO #c (type,path,name,concatStr)
    SELECT 'weekday' AS type,
        t1.path,t1.name,
        STUFF((
            SELECT ', ' + CAST(lbl AS VARCHAR(MAX))
            FROM d AS t2
            WHERE t2.path=t1.path AND t2.name=t1.name
            ORDER BY bm
            FOR XML PATH(''),TYPE
        ).value('.','VARCHAR(MAX)'),1,2,'') AS concatStr
    FROM d AS t1
    GROUP BY t1.path,t1.name;
    
    WITH d AS (
        SELECT DISTINCT path,
            name,
            mnth AS lbl,
            mnthbit AS bm
        FROM #t
    )
    INSERT INTO #c (type,path,name,concatStr)
    SELECT 'month' AS type,
        t1.path,t1.name,
        STUFF((
            SELECT ', ' + CAST(lbl AS VARCHAR(MAX))
            FROM d AS t2
            WHERE t2.path=t1.path AND t2.name=t1.name
            ORDER BY bm
            FOR XML PATH(''),TYPE
        ).value('.','VARCHAR(MAX)'),1,2,'') AS concatStr
    FROM d AS t1
    GROUP BY t1.path,t1.name;
    
    
    /* PUT EVERYTHING TOGETHER FOR THE REPORT */
    
    SELECT a.path,a.name,a.sched_type,
        a.creationdate,a.modifieddate,
        a.description AS sched_desc,
        a.laststatus AS sched_laststatus,
        a.lastruntime AS sched_lastrun,
        a.inactiveflags AS sched_inactive,
        CASE RecurrenceType
            WHEN 1 THEN 'Run once on '
            ELSE 'Starting on '
        END + CAST(StartDate AS VARCHAR(32)) + ' ' +
        CASE RecurrenceType
            WHEN 1 THEN ''
            WHEN 2 THEN 'repeat every ' + CAST(MinutesInterval AS VARCHAR(255)) + ' minutes.'
            WHEN 3 THEN 'repeat every ' + CAST(DaysInterval AS VARCHAR(255)) + ' days.'
            WHEN 4 THEN 
                CASE
                    WHEN WeeksInterval>1 THEN 'repeat every ' + CAST(WeeksInterval AS VARCHAR(255)) + ' on ' + COALESCE(wkdays.concatStr,'')
                    ELSE 'repeat every ' + COALESCE(wkdays.concatStr,'')
                END
            WHEN 5 THEN 'repeat every ' + COALESCE(mnths.concatStr,'') + ' on calendar day(s) '  + COALESCE(mnthdays.concatStr,'')
            WHEN 6 THEN 'run on the ' + CASE MonthlyWeek WHEN 1 THEN '1st' WHEN 2 THEN '2nd' WHEN 3 THEN '3rd' WHEN 4 THEN '4th' WHEN 5 THEN 'Last' END + ' week of ' + COALESCE(mnths.concatStr,'') + ' on ' + COALESCE(wkdays.concatStr,'')
        END AS sched_pattern
    FROM (
        SELECT DISTINCT path,name,creationdate,modifieddate,description,laststatus,lastruntime,inactiveflags,sched_type,recurrencetype,startdate,minutesinterval,daysinterval,weeksinterval,monthlyweek
        FROM #t
    ) AS a
    LEFT JOIN #c AS mnthdays ON mnthdays.path=a.path AND mnthdays.name=a.name AND mnthdays.type='monthday'
    LEFT JOIN #c AS wkdays ON wkdays.path=a.path AND wkdays.name=a.name AND wkdays.type='weekday'
    LEFT JOIN #c AS mnths ON mnths.path=a.path AND mnths.name=a.name AND mnths.type='month'
    
    DROP TABLE #t,#c;
    

    关于sql - 有没有办法查询将来的SSRS订阅时间表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25943877/

    相关文章:

    sql-server - 是否可以在通过Web服务执行SSRS报告期间指定数据源?

    javascript - 允许订阅者列表注册但阻止脚本

    javascript - 在 Meteor 中访问订阅时出现问题

    Azure 服务总线 - 订阅者可以独立订阅订阅并共享相同的消息吗?

    sql - 我的 Select SUM 查询返回 null。它应该返回 0

    reporting-services - SSRS 和新页面上的表格间距的奇怪行为

    reporting-services - 即使未设置默认值,SSRS 参数也默认为 NULL(全部)

    mysql - 从列表中更新设置值

    sql - 如何扫描表格的每一行,并根据前一行更新当前行?

    mysql - Percona 工具包在线架构更改 : Possible to add multiple columns all at once?