[英]is there a way to query future SSRS subscription schedules?
在我的辦公室,我們許多人使用SSRS來安排重復報告。 我想在接下來的幾天或一周內查看即將到來的報告運行的時間表,以便我們可以看到20個報告是否都將嘗試同時運行。 我怎么能做到這一點? 我創建了顯示訂閱信息的t-sql報告,但它們只顯示“上次運行”的日期和時間。 這對預測明天的瓶頸沒有幫助。 解決方案也應該包括數據驅動的訂閱。
SSRS將其所有數據存儲在ReportServer數據庫中,因此您需要一個對此數據庫具有讀訪問權限的帳戶。 這與以純模式運行的SSRS相關。 我也不確定此代碼是否會處理共享計划或數據驅動訂閱,但我很確定它們會是。 我只是沒有測試過它們。
請注意: Microsoft不建議或支持直接查詢ReportServer數據庫。 他們可以在下一個版本中更改結構或更新SSRS,您可能不會收到任何警告。 Microsoft建議在需要查詢有關報告服務的信息時始終使用SSRS Web服務。
這些是與提取訂閱信息相關的表格:
下面的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;
查詢下方可以幫助您獲取第二天報告的計划,這是基於報表服務器數據庫的標准元數據表。
查詢:
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];
此過程將提供與報告訂閱相關的所有值的列表。
在這里你會發現startdate。 並在此基礎上,您可以完成您的任務。
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
我回顧了這個問題的一系列不同解決方案。 我終於找到了一個效果最好的。
我的解決方案從Mike D.的回答開始,起初不喜歡他的查詢,因為它看起來很復雜,並且返回了太多的數據來審查 - 但我選擇修改他的查詢,因為它提供的信息不僅僅是訂閱(緩存計划) /快照)。
我修改了他的查詢如下:
排除不使用任何計划的服務器內容的結果
改進了格式化的品味
添加了有用的字段,提供有關如何使用計划的更多信息。
已解決的排序規則沖突錯誤消息: 無法解決臨時表和sys.objects之間的排序規則沖突 -
一旦我使用了其他功能,例如“數據驅動”訂閱而不是“定時”,我可能會稍后更新。如果我做了改進,我可能會更新
樣本數據
注意:我不明白的一件事是為什么有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 |
+-----------------------------------+------------+-----------------------+-------------------+-------------------+--------------------------------------------------------------------------+---------------------+------------------+------------------+-----------------------------------------------------------------------+--------------+--------------------------------------+--------------------------------------+------------------+-------------------+------------------+------------+---------+--------------------------------------+---------------------------------------------------------------------+------------------+----------------+---------------------------------------------------------+----------------------------------------------------------------------+
查詢(更新時間:2/12/2019)
此查詢基本相同,但我添加了更多數據元素來分析訂閱。 解決的一個問題是[EmailRecipients]剪切和截斷收件人的完整列表: 值(N'(/ ParameterValues / ParameterValue [Name =“CC”] / Value)[1]','varchar(250)')更改為值(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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.