如何使用SSIS包将表数据拆分成单独的指定Excel文件?

我正在处理来自SQL Server的一组数据,我想进入一组Excel文件。 这个任务需要自动运行在每月的基础上。 数据看起来像

Site ID FirstName LastName ------ ------- --------- --------- North 111 Jim Smith North 112 Tim Johnson North 113 Sachin Tedulkar South 201 Horatio Alger South 205 Jimi Hendrix South 215 Bugs Bunny 

我希望结果看起来像

 In Excel file named North.xls ID FirstName LastName 111 Jim Smith 112 Tim Johnson 113 Sachin Tedulkar In Excel file named South.xls ID FirstName LastName 201 Horatio Alger 205 Jimi Hendrix 215 Bugs Bunny 

网站列中有70到100个值,我想分割。 我正在使用SSIS来执行此任务,但是在从SQL Server中使用OLE DB Source任务从数据中提取数据后,我陷入了困境。 接下来应该怎么做? 如果有更简单的方法来使用其他工具来做到这一点,我也是这么做的。

你现在可能已经find了你的问题的答案。 这是可能会遇到这个问题的其他用户。 以下示例显示了如何dynamic实现可能存在的任意数量的网站。 该示例是使用SSIS 2008 R2SQL Server 2008 R2数据库创build的。

循序渐进的过程:

  1. 执行SQL Server数据库中的“SQL脚本”部分下给出的脚本,以创build一个名为dbo.Source的表并填充数据(类似于问题中给出的数据)。 它还创build一个名为dbo.GetSiteData的存储过程。

  2. 在SSIS包的连接上,创build一个OLE DB连接来连接到SQL Server。 我们将在后面的步骤中连接到Excel。

  3. 在SSIS包中,创build6个variables,如屏幕截图# 1所示。 使用值Template填充variablesSite ,这是一个将用于评估其他expression式的样本值。 使用值SELECT DISTINCT Site FROM dbo.SourceData设置variablesSELECT DISTINCT Site FROM dbo.SourceData 。 设置variablesExcelFolder的值为C:\temp\

  4. selectvariablesExcelFilePath并按F4查看属性。 将属性EvaluateAsExpression更改为True并使用value @[User::ExcelFolder] + @[User::Site] + ".xls"设置属性Expression 。 请参阅截图# 2

  5. selectvariablesExcelSheet并按F4查看属性。 将属性EvaluateAsExpression更改为True并使用ExcelSheet Variable Value下给出的值设置属性Expression 。 请参阅截图# 3

  6. 在SSIS包的控制stream选项卡上,放置一个Execute SQL Task并configuration它,如屏幕截图# 4和# 5所示 。 此任务将获取唯一的站点名称。

  7. 在SSIS包的“控制stream”选项卡上,在执行SQL任务之后放置一个Foreach Loop container ,并configurationForeach循环容器,如屏幕截图# 6和# 7所示。此循环将遍历结果集,并将每个站点读入一个variables。 然后,这个variables用于提供Excel文件的名称以及将在稍后添加的数据stream任务中的存储过程的参数。

  8. 在Foreach循环容器中,放置一个Execute SQL Task ,然后放置一个Data Flow Task 。 此时,控制stream选项卡应该如屏幕截图# 8所示。 您的软件包可能会显示错误,我们将在接下来的步骤中尽快解决。 我们将configuration数据stream任务,然后返回Foreach循环容器中的执行SQL任务。

  9. 在数据stream任务的内部,放置一个OLE DB Source并按照屏幕截图# 9和# 11所示进行configuration。 这将根据给定的网站从表中获取数据。 点击Parameters …button来设置查询参数。

  10. 如果表字段数据types在VARCHAR中,那么我们需要把它转换成NVARCHAR(unicode格式),否则这一步是不需要的。 在数据stream任务中,将Data Conversion转换放在OLE DB源之后,并按照截屏# 12所示进行configuration。

  11. 接下来,在数据stream任务中,放置一个Excel目标,点击第一个New …button,如屏幕截图# 13所示。

  12. 在“Excel连接pipe理器”对话框中,提供一个Excel文件path,然后单击确定。 请参阅截图# 14 。 返回到Excel Destination,点击第二个New …button,如屏幕截图# 15所示。 在“创build表格”对话框中,确保脚本如截屏# 16所示,然后单击“确定”。 如屏幕截图# 17所示,如果显示警告,请单击确定。 从Excel表格下拉列表中select值Template ,如屏幕截图# 18所示。 如屏幕截图# 19所示configuration列。

  13. 在SSIS包的连接pipe理器上,select新创build的Excel连接pipe理器,然后按F4查看属性。 将名称属性值更改为Excel 。 将DelayValidation更改为True以便如果Template.xls文件不存在,则不会收到错误消息。 使用值@[USer::ExcelFilePath]设置ServerNameexpression式。 请参阅截图# 20NOTE:应该已经在pathC:\ temp \ Template.xls中创build了一个Excel文件。 您可能想要保存它,以免在将来的devise更改中遇到。 如果文件被删除,您仍然可以重新创build它。

  14. 返回Excel目标并按照屏幕截图# 21所示进行configuration。 数据stream任务configuration完成后,应该如屏幕截图# 22所示。

  15. 回到控制stream选项卡,configurationForeach循环容器中的执行SQL任务,如屏幕截图# 23所示。 此任务将为每个站点名称创build新的Excel电子表格。

  16. 屏幕截图# 24显示了程序包执行的文件夹c:\ temp \中的内容。

  17. 屏幕截图# 25和# 26显示了软件包的执行情况。

  18. 屏幕截图# 27显示了程序包执行的文件夹c:\ temp \中的内容。

  19. 屏幕截图# 28和# 29显示了新创build的Excel电子表格North.xls和South.xls的内容。 两张表都包含相同名称的网站的数据。

希望有所帮助。

ExcelSheetvariables值:

 CREATE TABLE `Template` (`Id` Long, `FirstName` LongText, `LastName` LongText) 

SQL脚本:

 CREATE TABLE [dbo].[SourceData]( [Id] [int] IDENTITY(1,1) NOT NULL, [Site] [varchar](50) NOT NULL, [FirstName] [varchar](40) NOT NULL, [LastName] [varchar](40) NOT NULL, CONSTRAINT [PK_SourceData] PRIMARY KEY CLUSTERED ([Id] ASC) ) ON [PRIMARY] GO INSERT INTO dbo.SourceData (Site, FirstName, LastName) VALUES ('North', 'Jim', 'Smith'), ('North', 'Tim', 'Johnson'), ('North', 'Sachin', 'Tendulkar'), ('South', 'Horatio', 'Alger'), ('South', 'Jimi', 'Hendrix'), ('South', 'Bugs', 'Bunny'); GO CREATE PROCEDURE dbo.GetSiteData ( @Site VARCHAR(50) ) AS BEGIN SET NOCOUNT ON; SELECT Id , FirstName , LastName FROM dbo.SourceData WHERE Site = @Site END GO 

屏幕截图#1:

1

屏幕截图#2:

2

屏幕截图3:

3

屏幕截图#4:

4

屏幕截图5:

五

屏幕截图#6:

6

屏幕截图#7:

7

屏幕截图#8:

8

屏幕截图#9:

9

屏幕截图#10:

10

屏幕截图#11:

11

屏幕截图#12:

12

屏幕截图#13:

13

屏幕截图#14:

14

屏幕截图#15:

15

屏幕截图#16:

16

屏幕截图#17:

17

屏幕截图#18:

18

屏幕截图#19:

19

屏幕截图#20:

20

截图#21:

21

屏幕截图#22:

22

屏幕截图#23:

23

屏幕截图#24:

24

屏幕截图#25:

25

屏幕截图#26:

26

屏幕截图#27:

27

屏幕截图#28:

28

屏幕截图#29:

29

我认为SSIS是一个很好的使用工具,你有几个select。

基本上,你可以使用多播和条件分割对象来实现你想要的。

这是我将如何做到这一点:

1)我会创build两个MS Excel文件中的所有数据,因为我希望看到它。 删除数据并将其保存为模板文件并为完整文件创build副本。

2)在连接pipe理器中build立与这些文件的连接。

3)创build一个文件系统任务,在作业开始时用模板覆盖整个文件(其他的方法可以做到这一点,但我最喜欢这个)。

4)添加数据stream任务,并在其中放置一个OLE DB源,一个多播,两个有条件的分割,和两个MS Excel目的地。

5)configuration每个这些,你应该完成。 configuration非常直观,按照上面的顺序。

不知道这是否会起作用,但将所有条件查询放在一个表中,另一个字段放在一个文件名中。 然后使用for循环遍历其中的每一个,并dynamic修改转换任务的select子句。 SSIS将这些dynamic修改称为expression式。

你在你的表/条件表上做一个select,然后把它放到一个对象variables中。 然后在for循环中使用对象variables。

唯一不能确定的是映射到excel文件名。

编辑:也发现这个,它使用链接的服务器http://codebetter.com/blogs/raymond.lewallen/archive/2005/05/04/62781.aspx

我发现解决scheme的问题是与Excel目标。我重新安装微软访问引擎Redistributable(32位版本)。 一切都很好。 我有一个64位和32位的问题,他们不兼容,因为我的系统是64位。