【问题标题】:is there a way to query future SSRS subscription schedules?有没有办法查询未来的 SSRS 订阅时间表?
【发布时间】:2014-11-14 15:16:21
【问题描述】:

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

【问题讨论】:

  • 好奇这里是否有 sql 解决方案,我正在使用第三方工具来执行此操作(我怀疑这只是从数据库中查询)

标签: sql reporting-services subscriptions


【解决方案1】:

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;

【讨论】:

  • 哇,迈克!那是查询看起来很强大。在我运行它之前,我将不得不把它拆开,并可能把它展示给一些同事。谢谢!
【解决方案2】:

Below Query 可以帮助您获取第二天的报告计划,这是基于报告服务器数据库中的标准元数据表构建的。

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

查询:

将 getDate() 函数更改为具有特定的日程安排。

SELECT CAT.Name
      ,CAT.[Path] AS ReportPath 
      --,SUB.LastRunTime 
      ,SCH.NextRunTime
      ,CONVERT(VARCHAR(10), CONVERT(datetime, SCH.NextRunTime,   1), 101) As RunDate
      ,right(convert(varchar(32),SCH.NextRunTime,100),8) As RunTime
      ,SUB.[Description] 
      ,SUB.EventType 
      ,SUB.LastStatus 
      ,SUB.ModifiedDate 
      ,SCH.Name AS ScheduleName     
FROM reportserver.dbo.Subscriptions AS SUB 
     INNER JOIN reportserver.dbo.Users AS USR 
         ON SUB.OwnerID = USR.UserID 
     INNER JOIN reportserver.dbo.[Catalog] AS CAT 
         ON SUB.Report_OID = CAT.ItemID 
     INNER JOIN reportserver.dbo.ReportSchedule AS RS 
         ON SUB.Report_OID = RS.ReportID 
            AND SUB.SubscriptionID = RS.SubscriptionID 
     INNER JOIN reportserver.dbo.Schedule AS SCH 
         ON RS.ScheduleID = SCH.ScheduleID 

Where CONVERT(VARCHAR(10), CONVERT(datetime, SCH.NextRunTime,   1), 101)  = CONVERT(VARCHAR(10), CONVERT(datetime, getDate()+1,   1), 101) 

ORDER BY USR.UserName 
        ,CAT.[Path];

【讨论】:

    【解决方案3】:

    此过程将列出与报告订阅相关的所有值。

    在这里您会找到开始日期。并在此基础上完成您的任务。

    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 as ReportName,
    Convert(XML,a.[ExtensionSettings]).value('(//ParameterValue/Value[../Name="RENDER_FORMAT"])[1]','nvarchar(50)') as ReportExtension,
    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
    

    【讨论】:

      【解决方案4】:

      我查看了许多针对此问题的不同解决方案。我终于找到了一个效果最好的。

      我的解决方案以 Mike D 的回答开始(缓存计划/快照)。

      我将他的查询修改如下:

      • 排除不使用任何调度的服务器内容的结果

      • 改进了格式以适应口味

      • 添加了有用的字段,可提供有关如何使用计划的更多信息。

        • 计划类型:
        • 用途:订阅/快照/缓存
        • 订阅类型:如果不是订阅计划,则为 NULL
        • 计划名称:
      • 已解决排序规则冲突错误消息:Cannot resolve the collation conflict between temp table and sys.objects --

      我的解决方案(已测试:SSRS2008 和 SSRS2016)

      一旦我使用了其他功能(例如“数据驱动”订阅而不是“定时”订阅),我可能会在稍后更新此内容 或者,如果我做出改进,我可能会更新它

      样本数据

      注意:我不明白的一件事是为什么有 2 个 TimedSubscriptions(第 7-8 行),因为我查看了门户,但我只看到那里(第 8 行有共享时间表)。有谁知道为什么?

      +-----------------------------------+------------+-----------------------+-------------------+-------------------+--------------------------------------------------------------------------+---------------------+------------------+------------------+-----------------------------------------------------------------------+--------------+--------------------------------------+--------------------------------------+------------------+-------------------+------------------+------------+---------+--------------------------------------+---------------------------------------------------------------------+------------------+----------------+---------------------------------------------------------+----------------------------------------------------------------------+
      | name                              | sched_type | ScheduleType          | Usage             | SubscriptionType  | Elements_List                                                            | DeliveryExtension   | UserOwnerSubs    | UserCreatedSched | EmailRecipients                                                       | RenderFormat | ScheduleName                         | SubscriptionID                       | creationdate     | modifieddate      | modifieddate2    | StartDate  | EndDate | sched_desc                           | sched_laststatus                                                    | sched_lastrun    | sched_inactive | path                                                    | sched_pattern                                                        |
      +-----------------------------------+------------+-----------------------+-------------------+-------------------+--------------------------------------------------------------------------+---------------------+------------------+------------------+-----------------------------------------------------------------------+--------------+--------------------------------------+--------------------------------------+------------------+-------------------+------------------+------------+---------+--------------------------------------+---------------------------------------------------------------------+------------------+----------------+---------------------------------------------------------+----------------------------------------------------------------------+
      | PO Samples for Testing            | Daily      | TimedSubscription     | TimedSubscription | TimedSubscription | TO CC BCC ReplyTo IncludeReport RenderFormat Subject Comment IncludeLink | Report Server Email | GEORGES\bl0040ep | GEORGES\bl0040ep | (x24) TO: brenda.metcalf@DOMAIN;                                      | MHTML        | bb53dfb1-6819-4a99-94bd-28ec3dcf3ecb | AF285C92-31E5-4BC4-9D88-284E0A3ED17B | 2/8/19 10:38 AM  | 2/8/19 10:38 AM   | 2/12/19 10:44 AM | 2/8/2019   | NULL    | SUN Caryville PO Samples for Testing | Mail sent to brenda.metcalf@georgesinc.com;                         | 2/10/19 6:00 PM  | 0              | /fsqa/PO Samples for Testing                            | Starting on Feb  8 2019  6:00PM repeat every Sunday Ending on Never  |
      |                                   |            |                       |                   |                   |   Priority                                                               |                     |                  |                  |   Shannon.Driggers@DOMAIN; Joseph.Davenport@DOMAIN; Lisa.Fude@DOMAIN; |              |                                      |                                      |                  |                   |                  |            |         |                                      |   Shannon.Driggers@georgesinc.com; Joseph.Davenport@georgesinc.com; |                  |                |                                                         |                                                                      |
      |                                   |            |                       |                   |                   |                                                                          |                     |                  |                  |   Amanda.Bourff@DOMAIN; Pam.Overton@DOMAIN; Brent.Lester@DOMAIN;      |              |                                      |                                      |                  |                   |                  |            |         |                                      |   Lisa.Fude@georgesinc.com; Amanda.Bourff@georgesinc.com;           |                  |                |                                                         |                                                                      |
      |                                   |            |                       |                   |                   |                                                                          |                     |                  |                  |   Jerry.McKnight@DOMAIN; Jacob.Phillips@DOMAIN; Ricky.Cole@DOMAIN;    |              |                                      |                                      |                  |                   |                  |            |         |                                      |   Pam.Overton@georgesinc.com                                        |                  |                |                                                         |                                                                      |
      |                                   |            |                       |                   |                   |                                                                          |                     |                  |                  |   Jeremy.Morris@DOMAIN; Bryan.Claiborne@DOMAIN; Harold.Webb@DOMAIN;   |              |                                      |                                      |                  |                   |                  |            |         |                                      |                                                                     |                  |                |                                                         |                                                                      |
      |                                   |            |                       |                   |                   |                                                                          |                     |                  |                  |   Georgia.Roberts@DOMAIN; Chris.Malone@DOMAIN; Louis.Bargy@DOMAIN;    |              |                                      |                                      |                  |                   |                  |            |         |                                      |                                                                     |                  |                |                                                         |                                                                      |
      |                                   |            |                       |                   |                   |                                                                          |                     |                  |                  |   Josh.Bills@DOMAIN; Larry.Reid@DOMAIN; Chris.Thompson@DOMAIN;        |              |                                      |                                      |                  |                   |                  |            |         |                                      |                                                                     |                  |                |                                                         |                                                                      |
      |                                   |            |                       |                   |                   |                                                                          |                     |                  |                  |   Trenton.Marshall@DOMAIN; Willie.Baker@DOMAIN; Jack.Badon@DOMAIN;    |              |                                      |                                      |                  |                   |                  |            |         |                                      |                                                                     |                  |                |                                                         |                                                                      |
      |                                   |            |                       |                   |                   |                                                                          |                     |                  |                  |   Susan.Delaney@DOMAIN CC: Suzanne.Beauchamp@DOMAIN                   |              |                                      |                                      |                  |                   |                  |            |         |                                      |                                                                     |                  |                |                                                         |                                                                      |
      +-----------------------------------+------------+-----------------------+-------------------+-------------------+--------------------------------------------------------------------------+---------------------+------------------+------------------+-----------------------------------------------------------------------+--------------+--------------------------------------+--------------------------------------+------------------+-------------------+------------------+------------+---------+--------------------------------------+---------------------------------------------------------------------+------------------+----------------+---------------------------------------------------------+----------------------------------------------------------------------+
      | Sigma SO Loaded with Inventory    | Daily      | ReportHistorySchedule | ...ReportSnapshot | NULL              | NULL                                                                     | NULL                | NULL             | GEORGES\bl0040ep | NULL                                                                  | NULL         | 98a284df-3d03-445e-88d9-a44ed2d5c33a | NULL                                 | 7/2/18 2:38 PM   | 7/2/18 2:38 PM    | NULL             | 7/2/2018   | NULL    | NULL                                 | NULL                                                                | NULL             | NULL           | /Inventory/Sigma SO Loaded with Inventory (Cassville)   | Starting on Jul  2 2018  6:20AM repeat every 1 days. Ending on Never |
      |   (Cassville)                     |            |                       |                   |                   |                                                                          |                     |                  |                  |                                                                       |              |                                      |                                      |                  |                   |                  |            |         |                                      |                                                                     |                  |                |                                                         |                                                                      |
      +-----------------------------------+------------+-----------------------+-------------------+-------------------+--------------------------------------------------------------------------+---------------------+------------------+------------------+-----------------------------------------------------------------------+--------------+--------------------------------------+--------------------------------------+------------------+-------------------+------------------+------------+---------+--------------------------------------+---------------------------------------------------------------------+------------------+----------------+---------------------------------------------------------+----------------------------------------------------------------------+
      | Customer Aging Report By Customer | Hourly     | SharedSchedule        | RefreshCache      | RefreshCache      | NULL                                                                     | NULL                | GEORGES\bl0040ep | GEORGES\bl0040ep | NULL                                                                  | NULL         | Hourly: Even Hours After 6AM         | CF87DDDE-0F7F-416E-B403-E161AD0B14C1 | 10/25/18 1:55 PM | 12/13/18 12:46 PM | 11/29/18 3:55 PM | 11/30/2018 | NULL    | Hourly: Even Hours After 6AM (625)   | Cache refresh succeeded.                                            | 2/12/19 10:00 AM | 0              | /Accounts Receivables/Customer Aging Report By Customer | Starting on Nov 30 2018  6:00AM                                      |
      |                                   |            |                       |                   |                   |                                                                          |                     |                  |                  |                                                                       |              |                                      |                                      |                  |                   |                  |            |         |                                      |                                                                     |                  |                |                                                         |   repeat every 120 minutes. Ending on Never                          |
      +-----------------------------------+------------+-----------------------+-------------------+-------------------+--------------------------------------------------------------------------+---------------------+------------------+------------------+-----------------------------------------------------------------------+--------------+--------------------------------------+--------------------------------------+------------------+-------------------+------------------+------------+---------+--------------------------------------+---------------------------------------------------------------------+------------------+----------------+---------------------------------------------------------+----------------------------------------------------------------------+
      

      查询(更新:2019 年 2 月 12 日)

      这个查询本质上是一样的,但是我添加了更多的数据元素来分析订阅。解决的一个问题是 [EmailRecipients] 剪切和截断完整的收件人列表:value(N'(/ParameterValues/ParameterValue[Name="CC"]/Value)[1]', 'varchar(250)') 更改为 value(N'(/ParameterValues/ParameterValue[Name="CC"]/Value)[1]', 'varchar(max)').

      •     subs.DeliveryExtension
        
      •     subs.ExtensionSettings
        
      •     CAST(CAST(subs.ExtensionSettings AS XML).query('data(ParameterValues/ParameterValue/Name)') as nvarchar(500)) 
            AS Elements_List
        
      •     'TO: ' 
            + CAST(subs.ExtensionSettings AS xml).value(N'(/ParameterValues/ParameterValue[Name="TO"]/Value)[1]', 'varchar(250)') 
            + ' CC: ' 
            + ISNULL(CAST(subs.ExtensionSettings AS xml).value(N'(/ParameterValues/ParameterValue[Name="CC"]/Value)[1]', 'varchar(250)'), ' ')
            as EmailRecipients
        
      •     CAST(subs.ExtensionSettings AS xml).value(N'(/ParameterValues/ParameterValue[Name="RenderFormat"]/Value)[1]', 'varchar(250)') 
            as RenderFormat
        
      •     subs.SubscriptionID
        
      •     UserCreatedSched.UserName as [UserCreatedSched]
        

      SQL:

      ---------------------------------------------------------------------------------------------------------------------------------------------------------- 
      -- Get all schedule usage information: Subscription/ Snapshot/ Caching
      -- queryGetScheduleDetails
      -- https://stackoverflow.com/questions/25943877/is-there-a-way-to-query-future-ssrs-subscription-schedules/25944797#25944797
      -- these CTEs are used to match the bitmask fields in the schedule to determine which days & months the schedule is triggered on
      ---------------------------------------------------------------------------------------------------------------------------------------------------------- 
      
      IF @QueryCalled = 'queryGetScheduleDetails'
      BEGIN
      
          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.ModifiedDate as ModifiedDate2
              , subs.Description
              , UserOwnerSubs.UserName as [UserOwnerSubs] 
              , subs.LastStatus
              , subs.LastRunTime
              , subs.InactiveFlags
              , subs.EventType as [SubscriptionType]
              , subs.DeliveryExtension
              , subs.ExtensionSettings
              , CAST(CAST(subs.ExtensionSettings AS XML).query('data(ParameterValues/ParameterValue/Name)') as nvarchar(max)) AS Elements_List
              -- <RECIPIENTS function>
              , 
                  'TO: ' 
                  + CAST(subs.ExtensionSettings AS xml).value(N'(/ParameterValues/ParameterValue[Name="TO"]/Value)[1]', 'varchar(max)') 
                  + ' CC: ' 
                  + ISNULL(CAST(subs.ExtensionSettings AS xml).value(N'(/ParameterValues/ParameterValue[Name="CC"]/Value)[1]', 'varchar(max)'), ' ')
                  as EmailRecipients
              -- </RECIPIENTS function>
              , CAST(subs.ExtensionSettings AS xml).value(N'(/ParameterValues/ParameterValue[Name="RenderFormat"]/Value)[1]', 'varchar(max)') 
                  as RenderFormat
              , subs.SubscriptionID
              , sched.Name as [ScheduleName]
              , UserCreatedSched.UserName as [UserCreatedSched] 
              , sched.EventType as [ScheduleType]
              -- 
              , 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.EndDate
              , 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
              LEFT JOIN dbo.Users UserOwnerSubs ON subs.OwnerId = UserOwnerSubs.UserID
              LEFT JOIN dbo.Users UserCreatedSched ON sched.CreatedByID = UserCreatedSched.UserID
          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.name
              , a.sched_type
              , ScheduleType
              , CASE 
                  WHEN a.description IS NOT NULL THEN SubscriptionType
                  WHEN a.ScheduleType='ReportHistorySchedule' THEN '...ReportSnapshot'
                  ELSE '...ReportCache'
                  END AS [Usage]
              , SubscriptionType
              , a.Elements_List
              , a.DeliveryExtension
              , a.UserOwnerSubs
              , a.UserCreatedSched
              , a.EmailRecipients
              , a.RenderFormat
      --      , ExtensionSettings
              , ScheduleName
              , SubscriptionID
              , a.creationdate
              , a.modifieddate
              , a.modifieddate2
              , CAST(a.StartDate as date) as StartDate
              , CAST(a.EndDate as date) as EndDate
              , a.description AS sched_desc
              , a.laststatus AS sched_laststatus
              , a.lastruntime AS sched_lastrun
              , a.inactiveflags AS sched_inactive
              , a.path 
              , 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 
              + ' Ending on ' + ISNULL(CAST(EndDate AS VARCHAR(32)), 'Never')
              AS sched_pattern
          FROM 
              (
                  SELECT DISTINCT path,name,creationdate,modifieddate,modifieddate2,SubscriptionType,RenderFormat, /*ExtensionSettings,*/ ScheduleName, UserOwnerSubs,ScheduleType,SubscriptionID,description, UserCreatedSched,laststatus,lastruntime,StartDate,EndDate,inactiveflags,sched_type,recurrencetype,minutesinterval,daysinterval,weeksinterval,monthlyweek
                      ,cast(Elements_List as nvarchar(500)) as Elements_List, DeliveryExtension
                      , '(x'
                          + CAST((LEN(EmailRecipients) - LEN(REPLACE(EmailRecipients,'@',''))) / LEN('@') as nvarchar(10))
                          + ') '
                          + REPLACE(EmailRecipients,'@GEORGESINC.COM','@DOMAIN') 
                          as EmailRecipients
                  FROM #t
              ) AS a
              LEFT JOIN #c AS mnthdays ON mnthdays.path COLLATE DATABASE_DEFAULT =a.path COLLATE DATABASE_DEFAULT 
                  AND mnthdays.name COLLATE DATABASE_DEFAULT =a.name COLLATE DATABASE_DEFAULT 
                  AND mnthdays.type COLLATE DATABASE_DEFAULT ='monthday' COLLATE DATABASE_DEFAULT
              LEFT JOIN #c AS wkdays ON wkdays.path COLLATE DATABASE_DEFAULT =a.path COLLATE DATABASE_DEFAULT 
                  AND wkdays.name COLLATE DATABASE_DEFAULT=a.name COLLATE DATABASE_DEFAULT
                  AND wkdays.type COLLATE DATABASE_DEFAULT ='weekday' COLLATE DATABASE_DEFAULT
              LEFT JOIN #c AS mnths ON mnths.path COLLATE DATABASE_DEFAULT =a.path COLLATE DATABASE_DEFAULT 
                  AND mnths.name COLLATE DATABASE_DEFAULT =a.name COLLATE DATABASE_DEFAULT 
                  AND mnths.type COLLATE DATABASE_DEFAULT ='month' COLLATE DATABASE_DEFAULT
          WHERE 
              a.sched_type IS NOT NULL
              AND (@ReportName = 'All Reports' OR a.Name like @ReportName) 
      
          DROP TABLE #t,#c;
      

      【讨论】:

      • 我希望报告输出能够预测在特定时间段(下周、接下来的 14 天或其他任何时间)安排报告的日期和时间.我没有在您的答案中包含的报告输出中看到这一点...?
      • @BrettaFromLA 至于将发送多少订阅?什么时候?你解决了吗?
      • 没错。不幸的是我从来没有解决这个问题。我想我必须手动推断这些。
      • 嗯...是的,这很棘手。您正在寻找不同的时间间隔(小时/天/周/事件:即每月的第一天/等。然后您谈论的有些事情有结束日期,有些事情是无限期的——所以您需要建立一个视野(比如 30 天?)。我的查询帮助我显示了我的日程安排是如何在服务器上使用的。但是是的......预测订阅将是一项艰巨的工作。计算或显示所有订阅的商业案例是什么?
      • 很好,谢谢分享。生活总有新方向,祝你新目标好运。
      猜你喜欢
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2012-11-22
      • 2012-11-15
      相关资源
      最近更新 更多