我已经在 SQL Server Standard 上实现了类似的功能,以避免为 Enterprise 付费。首先,我构建了一个名为“Schedule a DDR”(数据驱动报告)的报告。该报告具有以下参数:
要计划的报告:如果满足数据测试,您要触发的 SSRS 报告(包括文件夹)的名称。例如。 "/Accounting/Report1"。
参数集:一个字符串,用于查找要在报告中使用的参数。例如。 “ABC”。
检查是否应运行报告的查询:将返回单个值(零或非零)的 SQL 查询。零将被解释为“不运行此报告”
电子邮件收件人:以分号分隔的电子邮件收件人列表,如果报告已运行,将收到报告。
请注意,“Schedule a DDR”报告是我们在此处实际运行的报告,它会将其输出发送给我;它的作用是运行另一个报告——在这种情况下它是“/Accounting/Report1”,它就是需要这些电子邮件地址的报告。因此,“安排 DDR”并不是真正的报告,尽管它像一个报告一样安排和运行——它是一个构建和运行报告的小工具。
我在 SQL 中也有一个表,定义如下:
CREATE TABLE [dbo].[ParameterSet](
[ID] [varchar](50) NULL,
[ParameterName] [varchar](50) NULL,
[Value] [varchar](2000) NULL
) ON [PRIMARY]
每个参数集——在本例中为“ABC”——在表中都有一组记录。在这种情况下,记录可能是 ABC/placecode/AA 和 ABC/year/2013,这意味着 ABC 中有两个参数:placecode 和 year,它们的值分别为“AA”和“2013”。
SSRS 中“Schedule a DDR”报告的数据集是
DDR.dbo.DDR3 @reportName, @parameterSet, @nonZeroQuery, @toEmail;
DDR3 是一个存储过程:
CREATE PROCEDURE [dbo].[DDR3]
@reportName nvarchar(200),
@parameterSet nvarchar(200),
@nonZeroQuery nvarchar(2000),
@toEmail nvarchar(2000)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
select ddr.dbo.RunADDR(@reportName,@parameterSet,@nonZeroQuery,@toEmail) as DDRresult;
END
RunADDR 是一个 CLR。这是它如何工作的概述;如果有人需要,我可以发布一些代码。
- 设置凭据
- 选择 ParameterSet 表中 parameterSet 字段与从 Schedule A DDR 报告中传入的参数集名称匹配的所有参数
- 对于这些参数中的每一个
- 设置参数数组以保存在检索到的行中定义的参数。 (这是您使用表格动态填写参数的方式。)
- 结束于
- 如果有从 Schedule A DDR 传入的“nonZeroQuery”值
- 然后运行 nonZeroQuery 并在返回零行时退出。 (这是在某些条件不满足时阻止查询执行的方法;任何返回其他零值的查询都将允许报告运行)
- 结束如果
- 现在让 SSRS 运行报告,使用我们刚刚从表中提取的参数,以及从 Schedule A DDR 传入的报告名称
- 获取输出并将其写入本地文件
- 将文件通过电子邮件发送到从 Schedule A DDR 传入的任何电子邮件地址