我查看了许多针对此问题的不同解决方案。我终于找到了一个效果最好的。
我的解决方案以 Mike D 的回答开始(缓存计划/快照)。
我将他的查询修改如下:
我的解决方案(已测试: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;