如何使用SSIS包将表数据拆分为单独的命名Excel文件?

Eri*_*ess 2 sql-server excel ssis

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我希望结果看起来像

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
Run Code Online (Sandbox Code Playgroud)

"网站"列中有70到100个值,我想拆分.我正在使用SSIS来执行此任务,但是在使用OLE DB Source任务从SQL Server中提取数据后,我陷入困境.接下来会发生什么?如果有一种更简单的方法可以使用其他工具来实现这一点,我也会对此持开放态度.

小智 12

你现在可能已经找到了问题的答案.这适用于可能偶然发现此问题的其他用户.以下示例显示了如何针对可能存在的任意数量的站点动态实现此操作.该示例是使用SSIS 2008 R2with SQL Server 2008 R2database 创建的.

分步过程:

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

  2. 在SSIS包的连接上,创建一个OLE DB连接以连接到SQL Server.我们将在后面的步骤中进行Excel连接.

  3. 在SSIS包上,创建6个变量,如屏幕截图#1所示.使用值填充变量SiteTemplate,这是将用于评估其他表达式的示例值.使用值设置变量SQLUniqueSitesSELECT DISTINCT Site FROM dbo.SourceData.使用值设置变量ExcelFolderC:\temp\

  4. 选择变量ExcelFilePath,然后按F4以查看属性.将属性EvaluateAsExpression更改为,True并使用值设置属性Expression@[User::ExcelFolder] + @[User::Site] + ".xls".参见截图#2.

  5. 选择变量ExcelSheet,然后按F4以查看属性.将属性EvaluateAsExpression更改为,True并使用ExcelSheet变量值下给定的值设置属性Expression.参见截图#3.

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

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

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

  9. 在数据流任务中,放置OLE DB Source并配置它,如屏幕截图#9和#11所示.这将基于给定站点从表中获取数据.单击参数...按钮以设置查询参数.

  10. 如果表字段数据类型在VARCHAR中,那么我们需要将其转换为NVARCHAR(unicode格式),否则不需要此步骤.在"数据流"任务中,Data Conversion在OLE DB源之后放置转换并按照屏幕截图#12所示进行配置.

  11. 接下来,在数据流任务中,放置一个Excel目标,单击第一个New ...按钮,如屏幕截图#13所示.

  12. 在"Excel连接管理器"对话框中,提供Excel文件路径,然后单击"确定".参见截图#14.返回Excel目标,单击第二个New ...按钮,如屏幕截图#15所示.在Create Table对话框中,确保脚本如屏幕截图#16所示,然后单击OK.如屏幕截图#17所示显示警告时,单击"确定".TemplateExcel表格下拉列表中选择值,如屏幕截图#18所示.配置列,如屏幕截图#19所示.

  13. 在SSIS包的连接管理器上,选择新创建的Excel连接管理器,然后按F4查看属性.将Name属性值更改为Excel.将DelayValidation更改为True如果文件Template.xls不存在,则不会收到错误消息.使用值设置ServerName表达式@[USer::ExcelFilePath].参见截图#20.NOTE:应该在路径C:\ temp\Template.xls中创建一个Excel文件.您可能希望将其保存,以便在将来的设计更改期间不会遇到此问题.如果删除文件,您仍然可以重新创建它.

  14. 返回Excel目标并按照屏幕截图#21所示进行配置.配置数据流任务后,它应如屏幕截图#22所示.

  15. 返回Control Flow选项卡,在Foreach循环容器中配置执行SQL任务,如屏幕截图#23所示.此任务将为每个站点名称创建新的Excel电子表格.

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

  17. 屏幕截图#25和#26显示了包执行.

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

  19. 屏幕截图#28和#29显示了新创建的Excel电子表格North.xls和South.xls的内容.两个工作表都包含相应名称的站点的数据.

希望有所帮助.

ExcelSheet变量值:

CREATE TABLE `Template` (`Id` Long, `FirstName` LongText, `LastName` LongText)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

截图#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