Report launcher to run SSRS report subscriptions on demand
Problem
SSRS report subscriptions are a great feature for automatic report delivery on regular schedule. Unfortunately, there is no easy way to run a subscribed report on demand. If you need to run one of these reports on demand, you will need to dig into the Report Server database to find the right subscription. When it is needed to be run on demand more frequently, it becomes annoying and you lose valuable time.
Solution
This tip will show how this can be handled more elegantly by two new SSRS reports. One report will allow us to run individual subscriptions of reports and the second will allow to run all subscriptions handled by a schedule.
Background
The automatic execution of report subscriptions is handled by SQL Server Agent. SSRS creates a separate agent job for each shared schedule and each individual schedule. The jobs are named by the GUIDs of that particular schedules as shown below which are not very useful.

If you take a closer look at the job created by SSRS you will notice that in fact the job does not executes the report itself, but instead it calls the [dbo].[AddEvent] stored procedure from the report server database to add an event into the [dbo].[Event] table. Based on the subscription schedule there are 2 types of events - TimedSubscription or SharedSchedule.
exec [ReportServer].dbo.AddEvent
@EventType='TimedSubscription',
@EventData='be13bfa4-9c36-423f-90b8-bd449bfd7eb3'
exec [ReportServer].dbo.AddEvent
@EventType='SharedSchedule',
@EventData='3045b1a3-ce3b-430e-a5dd-99953d389d80'
The @EventType parameter of the [dbo].[AddEvent] stored procedure specifies a type of Schedule and the @EventData represents the GUID for the particular shared schedule or GUID of an individual subscription.
SSRS regularly checks the events in the reports server database and if it finds one of the above mentioned events, it automatically starts processing the subscriptions. In the case of a TimedSubscription the single subscription is processed and in the case of a SharedSchedule all subscription sharing that schedule are processed one by one.
Creating SSRS Reports to Launch Reports
We will design the reports so each of the reports will have three datasets. The first dataset will get information about the Subscriptions or Schedules. The second dataset will handle execution of the subscription or schedule and the third dataset will provide information about the launched subscription or schedule and that information will be shown on the report itself.
Our reports will use four different tables from the Report Server database.
- [dbo].[Catalog] - catalog table which contains information about all reports and folders in the SSRS Instance
- [dbo].[Subscriptions] - table containing information about all subscriptions
- [dbo].[Schedule] - containing information about all schedules
- [dbo].[ReportSchedule] - contains links among Schedules, Subscriptions and Reports
SSRS report to launch individual subscription reports
The first report to develop will handle launching individual subscriptions

The report contains two parameters SubscriptionToLaunch and LaunchedSubscritption. Available values of the SubscriptionToLaunch is populated by the ReportSubscriptions Dataset and is used to select a particular subscription for execution. The LaunchedSubscription has a default value populated by the LaunchSubscription Dataset, which handles the execution itself and is subsequently used by the LaunchedSubscriptionDetails Dataset, which returns details for the launched subscription and information from this data set are shown on the report itself.
ReportSubscriptions Dataset
As mentioned above, the ReportSubscriptions dataset is used to populate the SubscriptionsToLaunch parameter and the purpose of this parameter is to select a particular subscription for execution. This queries the [dbo].[Subscriptions] and [dbo].[Catalog] tables. From the subscription we will receive the [SubscriptionID] and subscription [Description] and from the [dbo].[Catalog] we retrieve the subscribed report [Name].
SELECT
S.[SubscriptionID]
,C.[Name] + ' (' + S.[Description] + ')' AS [DisplayName]
FROM [dbo].[Subscriptions] S
INNER JOIN [dbo].[Catalog] C ON S.[Report_OID] = C.[ItemID]
ORDER BY [DisplayName]
LaunchSubscription Dataset
This dataset handles the execution of the subscription by calling the [dbo].[AddEvent] stored procedure in ReportServer database. Because the [dbo].[AddEvent] stored procedure does not return any record set, we have to return some information so the Dataset can be used by reporting services. Because of this, the query contains a SELECT statement, which returns the SubscriptionID. The @EventData variable is mapped to the SubscriptionToLaunch parameter.
exec [dbo].[AddEvent] 'TimedSubscription', @EventData;
SELECT
@EventData AS [SubscriptionID]

LaunchedSubscriptionDetails DataSet
The third dataset provides information about launched subscriptions. Data from this dataset are used on the report to inform users about subscription and report details.
SELECT
S.[Description] AS [SubscriptionDescription]
,C.[Name] AS [ReportName]
,S.[DeliveryExtension]
FROM [dbo].[Subscriptions] S
INNER JOIN [dbo].[Catalog] C ON S.[Report_OID] = C.[ItemID]
WHERE
S.[SubscriptionID] = @LaunchedSubscription
Once you compose everything together, you can use the report for launching subscriptions. The final result will look like below.

SSRS report to launch shared scheduled reports
The second report mentioned is used to execute shared schedules. When a shared schedule is launched, all the subscriptions using that shared schedule will be launched one by one. The structure of the report is the same as the previous report with only slight differences in the queries.

ReportSchedules Dataset
In contrast to the ReportSubscriptions query for the previous report, we will query only the names of the shared schedules. We get this information from the [dbo].[Schedules] table. As this table contains records for both SharedSchedules and also for TimedSubscriptions, we limit the results only to get the shared ones. Also we get only schedules for which a record in [dbo].[ReportSchedule] exists as we do not want to execute shared schedules without a report subscription.
SELECT
[ScheduleID],
[Name]
FROM [dbo].[Schedule] S
WHERE
[EventType] = 'SharedSchedule'
AND
[ScheduleID] IN (SELECT [ScheduleID] FROM [dbo].[ReportSchedule])
ORDER BY [Name]
LaunchSchedule Dataset
The LaunchSchedule is similar to the LaunchSubscription query. The only difference is that instead of passing TimedSubscription as @EventType we will pass SharedShedule.
exec [dbo].[AddEvent] 'SharedSchedule', @EventData;
SELECT
@EventData AS [ScheduleID]
LaunchedScheduleDetails Dataset
Again similar to the LaunchedSubscriptionDetails dataset from the previous report, this will return details about the executed schedule. In contrast to the LaunchedSubscriptionDetails, this query can return multiple rows as one shared schedule can handle multiple report subscriptions.
SELECT
S.[Description] AS [SubscriptionDescription]
,C.[Name] AS [ReportName]
,S.[DeliveryExtension]
FROM [dbo].[ReportSchedule] RS
INNER JOIN [dbo].[Subscriptions] S ON RS.[SubscriptionID] = S.[SubscriptionID]
INNER JOIN [dbo].[Catalog] C ON RS.[ReportID] = C.[ItemID]
WHERE
RS.[ScheduleID] = @LaunchedSchedule
Once the report is composed, we can use it to launch subscriptions handled by shared schedules. The result will look like the image below.

Next Steps
- Reports presented in this tip provide only basic information. You can elaborate on the reporting database and update the reports to provide more information about the subscriptions and reports.
- Reports as they are presented here are suitable for administrators. You can create a set of stored procedures in the reporting database to get the subscriptions and schedules and also create procedures for launching subscriptions and returning necessary information. These procedures can process information about the currently logged in user and limit the execution to subscriptions and schedules created by the user who is running the report. Then you can provide such reports to end users to allow them on demand execution of subscriptions.
- You can create additional overview reports for the Schedules and Subscription which will allow you to group and sort the subscriptions. Then upon a click you can execute these reports providing the right parameters to launch a particular subscription.
- You can download the complete SSRS project with sample reports here.
Report launcher to run SSRS report subscriptions on demand的更多相关文章
- Session for SSRS Report of Microsoft Dynamics AX
Session for SSRS Report of Microsoft Dynamics AX 版权声明:本文为博主原创文章,未经博主允许不得转载. Contract •A data contrac ...
- Dynamics CRM 2015中的SSRS Report集成配置
大家应该都知道.Dynamics CRM能集成SSRS Report,而且我也在之前的博文中讨论过怎样制作一个简单的SSRS Report并部署到Dynamics CRM中.今天我们来看看一些比較有用 ...
- Dynamics AX 2012 R2 从代码中调用SSRS Report
平时,我们制作SSRS Report的方法主要有两种:使用Query或RDP.如果需要为报表传递参数,就要在代码中为报表参数赋值,然后在代码中调用报表.下面我总结下这两种报表在代码中传参和调用的方式: ...
- How to get the underlying SSRS Report Query, reset query , add your own ranges and execute report [AX2012]
Below is the small code snippet to get the underlying query of the SSRS report, reset query, prompt ...
- SSRS Report Knowledge Base
1. 获取Textbox的值,根据Textbox值更改单元格颜色 Textbox值:=ReportItems!Textbox1.Value 当前单元格的值:=Me.Value =IIF(ReportI ...
- 解决:insert Vodafone sim card,open the mms read report,when receive the read report,cann't download..
insert Vodafone sim card,open the mms read report,when receive the read report,cann't download the m ...
- 解决:insert Vodafone sim card,open the mms read report,when receive the read report,cann't download..
insert Vodafone sim card,open the mms read report,when receive the read report,cann't download the m ...
- How to display SSRS report based on customer/Vendor specific language [AX2012]
Common requirement is to show the reports in customer’s language. [example : Quotations, sales confi ...
- How to using expression setup BackgroundColor AX2012 SSRS Report[AX2012]
tile label using [#99ccff] property BackgroundColor - > expression =Iif(Fields!Flag.Value = " ...
随机推荐
- Magento打印(配送单、退款单、发票)时PDF中的乱码问题
我使用Magento1.4.2,在其自带的TTF文件不能很好地解析中文字符,TTF文件的位置在网站根目录下的/lib/LinLibertineFont/中.打印的中文字符都是这样的 解决方法: 1.在 ...
- 根据IP查主机名和MAC地址
根据IP查主机名: nbtstat -a XXX.XXX.XXX.XXX根据IP查MAC地址: arp -a XXX.XXX.XXX.XXXXXX.XXX.XXX.XXX指代要查的主机的IP
- ExtractTablesFromSQL
public static string[] ExtractTablesFromSQL(string cmdString) { return Regex.Matches(cmdString, @&qu ...
- Swift-09-可空链式调用(Optional Chaining)
我对这个的理解就是:我们有可能会用到其他的属性或者方法,当我们在使用其他的时候,可以使用点语法去访问另一个的属性,这样的使用,就形成了链式访问. 可空链式调用是一种可以请求和调用属性.方法及下表的过程 ...
- c#中匿名函数lamb表达式
c#中匿名函数lamb表达式 实例一:(其实,这样都是些语法糖) using System; using System.Collections.Generic; using System.Linq; ...
- 七参数计算正确性验证——Coord软件使用
我计算了一套七参数,但是别人说计算结果不正确,我只好验证一下. 最后知道为啥算错了,原来是尺度K的单位问题,我计算七参数的单位是PPM,而下面软件的单位是m所以需要除以1000000进行计算. 下面是 ...
- 使用Fiddler对android应用抓包
工作原理 先上个图 此图一目了然,可以看出fiddler在请求中所处的位置,我们就可以确定它能干些什么. 它实际工作在本机的8888端口http代理,我们启动fiddler时,它会自动更改代理设置: ...
- Xshell下VI打开文件中文乱码解决
修改 /etc/sysconfig/i18n 成如下值:LANG="zh_CN.utf8"LANGUAGE="zh_CN.utf8"SUPPORTED=&quo ...
- 通常Struts框架会自动地从action mapping中创建action对象
开发者不必在Spring中去注册action,尽管可以这么去做,通常Struts框架会自动地从action mapping中创建action对象 struts2-spring-plugin-x-x-x ...
- V$RECOVERY_PROGRESS
v$recovery_progress视图可以用来监控数据库recovery操作,以及所需时间的估算.此外,可以用来监控physical standby环境的redo应用速度. SQL> sel ...