【问题标题】:Data Driven Subscriptions SSRS Standard Edition 2008数据驱动订阅 SSRS 标准版 2008
【发布时间】:2011-10-24 12:45:24
【问题描述】:

我对 MSSQL 和 SSRS 还很陌生。

我正在尝试在 MSSQL 2008 标准 SSRS 中创建一个数据驱动订阅,该订阅执行以下操作。

将报告结果通过电子邮件发送到报告中的电子邮件地址。 每天运行

例如:

Select full_name, email_address from users where (full_name = 'Mark Price')

这将使用 email_address 列来确定要向谁发送电子邮件,这也必须适用于具有多个电子邮件地址的多个结果。

我正在考虑这样做的方式是订阅以运行查询,如果没有找到结果,那么什么也不会发生。 但是,如果找到结果,则报告会更改订阅表中的行,以便在下一分钟左右再次运行报告,并在结果中找到正确的电子邮件信息。 这是不是一个愚蠢的想法?

我发现一些博客文章声称这是有效的,但我无法理解他们的代码以知道它的作用。

那么,您有什么建议可以解决这个问题,或者您是否可以建议互联网上已有的内容并附上简短说明?

【问题讨论】:

  • 不,这不是一个愚蠢的想法,但 MS 的部分答案是去 SSRS Enterprise 以获得开箱即用的数据驱动订阅。
  • 如果有人感兴趣,我放弃并用 PHP 完成了 :-)

标签: sql sql-server sql-server-2008 reporting-services ssrs-2008


【解决方案1】:

这让我回到了以前的工作,我在我们的 SQL Server 2005 Enterprise 开发盒上使用数据驱动订阅编写了一个问题的解决方案,然后我沮丧地发现我们的客户只有标准版。

我当时收藏了this post,它看起来很有希望,但在我有机会实施它之前我就换了工作。

当然,它的目标是 2005 年,但其中一位 cmets 似乎暗示它也适用于 2008 年。

【讨论】:

    【解决方案2】:

    我已经在 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 传入的任何电子邮件地址

    【讨论】:

      【解决方案3】:

      我不会创建订阅来修改订阅表,而是将该部分放在其他地方,例如 SQL 代理中。但想法是一样的。一条定期运行的 SQL 可以在订阅表中添加或更改行。

      “SSRS 订阅表”的 Google 返回了一些有用的结果:Here's an article 基于 2005 年,但原则应与 2008 年相同:This article 适用于 2008 年,与您所描述的非常接近也是。

      我会一一查看订阅表中的字段并确定您需要的每个字段。尝试手动创建一行(手动插入语句)向自己发送订阅。

      【讨论】:

        【解决方案4】:

        R-Tag 支持带有 SQL Server 标准版的 SSRS 数据驱动报表

        【讨论】:

        • 如果在标准 SSRS 中使用第三方应用程序进行数据驱动订阅,或者甚至以编程方式(即在 C# 中)实现某些东西,这是否会造成 Microsoft 可以采取行动的许可违规?
        【解决方案5】:

        您可以使用第三方解决方案 SQL-RD 创建和运行数据驱动的计划,而无需升级到 SQL 企业版。它还带有基于事件的调度(触发事件报告,包括数据库更改、文件更改、收到的电子邮件等)。

        【讨论】:

        • 如果在标准 SSRS 中使用第三方应用程序进行数据驱动订阅,或者甚至以编程方式(即在 C# 中)实现某些东西,这是否会造成 Microsoft 可以采取行动的许可违规?
        猜你喜欢
        • 2017-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多