0

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

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

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

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

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

  1. 使用Execute SQL Task获取活动报告 ID 列表
  2. 用于循环遍历每个报告 ID的Foreach Container Loop集合ADO Enumerator
  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 报告创建一个平面文件连接管理器?

4

3 回答 3

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。

于 2011-12-02T20:14:12.217 回答
0

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

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

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

于 2011-12-02T17:42:14.857 回答
0

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

通过不使用数据流,您可以绕过需要为每个报告单独的数据流任务和文件连接管理器。相反,您可以使用 BCP(批量复制程序)将数据复制到文件中,而无需预先定义元数据。BCP 将获取您的存储过程结果集并将其转储到文件中。 Dustin Ryan 有一篇关于如何在 BIDN 上执行此操作的精彩文章。在某些情况下,如果不需要转换,在 SSIS 中使用 BCP 可能是比数据流任务更好的选择,这就是其中之一。

于 2011-12-02T17:50:29.027 回答