【问题标题】:SSIS Using Loop Container Through Report Ids to create separate csv filesSSIS 通过报告 ID 使用循环容器创建单独的 csv 文件
【发布时间】:2011-12-02 17:12:51
【问题描述】:

让我先说在 SSIS 方面我还是个新手。我正在尝试替换当前具有 13 个查询的 MS Access 流程,这些查询在 excel 中创建并通过电子邮件发送给用户列表。

我的 SSIS 包需要获取报告名称、电子邮件地址列表、报告数据,创建一个 csv 文件,然后为每个文件发送一封电子邮件。

我在 SQL Server 中创建了以下内容:

  1. 包含报告的表格 - 每个表格都有一个 ReportId
  2. 包含用户电子邮件地址的表格
  3. 将用户链接到每个报告的连接表
  4. 当我传入 ReportId 时创建了一个存储过程,它会返回电子邮件分布列表以及一些报告详细信息以供我发送电子邮件时使用
  5. 创建了我将 ReportId 传递给的存储过程。作为回报,我将获得该报告的任何值。每个报告都有一个不同的查询,该查询返回不同的数据列。

我还尝试创建一个执行以下操作的 SSIS 包:

  1. 使用Execute SQL Task 获取活动报告ID 列表
  2. Foreach Container Loop 设置为ADO Enumerator 以循环遍历每个报告ID
  3. Execute SQL Task 将返回我的报告详细信息和每个报告 ID 的电子邮件地址列表。

然后我尝试在我的循环中放置一个 Data Flow Task 并运行我的存储过程以返回每个报告 ID 的报告数据,但我收到一条错误消息:

Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. 
Error code: 0x80040E55. An OLE DB record is available.  
Source: "Microsoft SQL Server Native Client 10.0"  Hresult: 0x80040E55  Description: "Column does not exist.". 

我猜这个错误是因为我的列在每个报告上都不相同。如果是这种情况,那么您对如何进行有什么建议吗?

我应该在我的 SSIS 包中使用哪些步骤来检查每个报告?我是否需要创建单独的 SSIS 包来运行每个报告?

如果我可以在一个包中运行它,我是否需要为我生成的每个 csv 报告创建一个平面文件连接管理器?

【问题讨论】:

    标签: sql-server sql-server-2005 ssis foreach export-to-csv


    【解决方案1】:

    我认为你的方法是合理的,你只需要在第 3 步做一些不同的事情。我认为sp_send_dbmail 可能是一个选项(通过执行 SQL 任务调用它)。

    您可以将 #6 查询分配给 @query 参数 (@query = "EXECUTE dbo.MakeReport @reportid=10') 和 @attach_query_result_as_file=1,并且假设您已打开数据库邮件,它将发送一个将查询结果以 CSV 格式发送给收件人。

    使用表达式根据您的第一个查询的结果设置 to、cc 和 bcc,瞧,spam-o-matic。

    【讨论】:

    • 我喜欢这个想法,因为如果我使用存储过程,那么我可能会一起摆脱 SSIS。如果我可以包含标题列,你知道我是否从服务器发送一个 csv 文件?
    【解决方案2】:

    如果您的报告有不同的列,您将需要为每个列使用不同的数据流。如果您仍想在同一个 Foreach 循环中执行它们,您可以尝试执行类似“reportType”之类的变量,该变量在您运行Execute SQL Task 时填充。之后,您可以将那里的流引导到正确的数据流。下图显示了条件流的示例:

    在本教程中,尽管目标不同,但作者描述了如何创建条件流:http://www.simple-talk.com/sql/ssis/xml-configuration-files-in-sql-server-integration-services/

    在这里您可以找到有关变量的更多信息:http://sqlfool.com/2009/08/getting-started-with-variables-in-ssis/

    【讨论】:

      【解决方案3】:

      不幸的是,SSIS 要求在设计时设置数据流管道的元数据,因此如果您要使用数据流任务,则需要为每个报告单独设置一个任务。

      您可以通过不使用数据流来避免需要为每个报告使用单独的数据流任务和文件连接管理器。相反,您可以使用 BCP(批量复制程序)将数据复制到文件中,而无需预先定义元数据。 BCP 将获取您的存储过程结果集并将其转储到文件中。 Dustin Ryan has a great article on how to do this on BIDN. 在某些情况下,如果不需要转换,在 SSIS 中使用 BCP 可能是比数据流任务更好的选择,这就是其中之一。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-01
        • 2020-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-30
        相关资源
        最近更新 更多