如何通过 SQL 代理作业从游标驱动的 SQL 存储过程中使用参数执行 SSRS 报告

时间:2021-06-04 00:29:22

标签: sql-server reporting-services

我希望有一个夜间 SQL Server 代理作业,它只运行一个 SSRS 报告,该报告具有一个由存储过程中的 SQL 游标驱动的参数,并将生成的 PDF 保存到文件系统目录中。将为光标中选取的每个参数值生成一份报告。

这是基于一个 SQL 查询,例如,检测表中过去 24 小时的行更改。

我需要将每行一个 PDF 写入 Windows 文件系统目录。

所以我想知道是否可以通过此过程执行外部 SSRS 报告并将该报告作为 PDF 导出到目录?

1 个答案:

答案 0 :(得分:0)

可以创建一个订阅,将 PDF 生成到文件夹中。

订阅由使用 ReportServer 中的 AddEvent SP 和订阅的订阅 ID 的存储过程触发。

EXEC ReportServer.dbo.AddEvent @EventType = 'TimedSubscription', @EventData = @SUBSCRIPTION_ID;

如果参数需要更新,您可以从 Subscriptions 表中获取 XML 并使用 .modify 进行更新。

这是一个如何使用它的例子:

--GET SUBSCRIPTION PARAMTERS AND EXTENSIUONS
SELECT @EXTENSION_SETTINGS = ExtensionSettings, @PARAMETERS = [Parameters]
FROM ReportServer.dbo.Subscriptions
WHERE SubscriptionID = @SUBSCRIPTION_ID;

--LOOP SETUP USING ROW_NUM FROM QUERY - YOUR METHOD MAY DIFFER
SET @RECORD_ID = 1
SET @MAX_RECORD_ID = (SELECT MAX(RECORD_ID) FROM #RECORDS)


WHILE @RECORD_ID <= @MAX_RECORD_ID 
BEGIN


--SET EXTENSION OPTIONS FOR FILENAME AND PATH IF NECESSARY
SET @EXTENSION_SETTINGS.modify('replace value of (/ParameterValues/ParameterValue[Name="FILENAME"]/Value/text())[1] with sql:variable("@FILENAME")');
SET @EXTENSION_SETTINGS.modify('replace value of (/ParameterValues/ParameterValue[Name="PATH"]/Value/text())[1] with sql:variable("@PATH")');

--SET REPORT PARAMETER ID FROM VARIABLE @ID
SET @PARAMETERS.modify('replace value of (/ParameterValues/ParameterValue[Name="ID"]/Value/text())[1] with sql:variable("@ID")');


--UPDATE SUBSCRIPTION PARAMETERS 
UPDATE ReportServer.dbo.Subscriptions
SET ExtensionSettings = CAST(@EXTENSION_SETTINGS AS VARCHAR(8000)), 
    [Parameters]      = CAST(@PARAMETERS AS VARCHAR(8000))
WHERE SubscriptionID = @SUBSCRIPTION_ID


EXEC ReportServer.dbo.AddEvent @EventType = 'TimedSubscription', @EventData = @SUBSCRIPTION_ID;     --ADD SUBSCRIPTION TRIGGER EVENT 

--SET @RECORD_ID = @RECORD_ID + 1
END