我希望有一个夜间 SQL Server 代理作业,它只运行一个 SSRS 报告,该报告具有一个由存储过程中的 SQL 游标驱动的参数,并将生成的 PDF 保存到文件系统目录中。将为光标中选取的每个参数值生成一份报告。
这是基于一个 SQL 查询,例如,检测表中过去 24 小时的行更改。
我需要将每行一个 PDF 写入 Windows 文件系统目录。
所以我想知道是否可以通过此过程执行外部 SSRS 报告并将该报告作为 PDF 导出到目录?
答案 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