By far the easiest place to setup a SQL
Server 2012 SSRS subscription for a report is through the Reporting
Services Report Manager. A simple GUI guides users through the
process of selecting a subscription type, where to save or send the output and on what
schedule to execute. For example, you can
specify the report to execute every morning at 9am and email the
report as a pdf to a set of users, or to save the output file to a
fileshare.
Now suppose you don’t want this
report subscription to email or save the file on an automated
schedule, but rather to be manually/actively triggered. Perhaps you
want to test the subscription is working or you want it to be
triggered by a third party application. There’s more than one way
of doing this, and here I will cover two methods:
When a subscription is created in the
SSRS Reports Manager, a corresponding SQL agent job is also created
on the SQL server. Unfortunately there is no way to control the name
of the job and, once created, it cannot be modified without affecting
the subscription. The name of the job will be an UID similar to the
highlighted item below:
Right-click on this job and select
“Start Job at step…” to run it. This will cause the
subscription to execute, and you will see in the SQL Server Reporting
Services Report Manager that the Last Run field for the subscription
has been updated. This is the simplest approach and is particularly
useful for testing the item:
Alternatively, a job request can be
made using SQL code:
EXEC
dbo.sp_start_job
N'AAB7E0BD-8089-4330-A3D6-8B95ACD90132'
This will have exactly the same effect
as right-clicking to execute the job.
The drawback to this approach is that
SQL Agent job execution requests for a single job do not queue or run
in parallel. If the job is already running then the subsequent job
execution request will fail:
Request
to run job AAB7E0BD-8089-4330-A3D6-8B95ACD90132 refused because the
job already has a pending request
Therefore if multiple users are going
to be issuing requests then this may not be the best approach.
Method 2 – Stored Procedure
If you open the
SQL Agent Job used for the subscription and examine the step that has
been defined, you will see that it is executing a stored procedure:
The AddEvent
stored procedure is being called:
exec
[ReportServer].dbo.AddEvent
@EventType='TimedSubscription',
@EventData='a7fd8d5f-0af9-49ec-ad8e-b273d44f1bb0'
This stored
procedure inserts a record in the ReportServer.dbo.Events table. The
Events table is polled every few seconds by the server and any
entries in this table will trigger the subscription to be executed.
Note that the @EventData variable value is the same as the SQL Agent
Job name.
This same SQL
stored procedure can in fact be run manually against the SQL Server
msdb database directly and will have exactly the same effect – it
will trigger the subscription to execute. However, as we are no
longer using the SQL Agent to call the procedure, we can actually run
this code multiple times as quickly as we like. Each time it will
insert a record into the events table, and every entry will trigger a
new subscription execution, even if it is the same subscription.
Effectively, subscription requests will be now be queued, and run
sequentially.
If a subscription
execution request needs to be made actively, or occur multiple times
in a short space of time, and each request needs to be completed,
then this method is a good approach to handling the scenario.
No comments:
Post a Comment