代码之家  ›  专栏  ›  技术社区  ›  Eric Ness

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

  •  2
  • Eric Ness  · 技术社区  · 15 年前

    我正在处理来自SQLServer的一组数据,我希望将这些数据放入一组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
    

    4 回复  |  直到 13 年前
        1
  •  13
  •   user756519 user756519    13 年前

    你现在可能已经找到问题的答案了。这是为其他用户谁可能偶然发现这个问题。下面的示例显示了如何为可能存在的任意数量的站点动态实现这一点。该示例是使用 SSIS 2008 R2 具有 SQL Server 2008 R2 数据库。

    1. 执行SQLServer数据库中SQLScripts部分中给定的脚本,以创建一个名为 dbo.Source 并填充数据(类似于问题中给出的数据)。它还创建一个名为 dbo.GetSiteData

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

    3. 在SSIS包上,创建6个变量,如屏幕截图所示# 1 地点 有价值的 Template SQLUniqueSites网站 SELECT DISTINCT Site FROM dbo.SourceData Excel文件夹 有价值的 C:\temp\

    4. 选择变量 F4 求值表达式 True 设置属性 表达式 @[User::ExcelFolder] + @[User::Site] + ".xls" . 参考屏幕截图# 2 .

    5. Excel工作表 F4层 查看属性。更改属性 求值表达式 是的 设置属性 下给出的值

    6. 在SSIS包的“控制流”选项卡上,放置 Execute SQL Task 4 5 . 此任务将获取唯一的站点名称。

    7. 在SSIS包的“控制流”选项卡上,放置 Foreach Loop container 以及# 7 这个循环将遍历结果集,并将每个站点读入一个变量。然后,此变量用于提供Excel文件的名称以及数据流任务中存储过程的参数,该任务将很快添加。

    8. 在Foreach循环容器中,放置 执行SQL任务 然后放置一个 Data Flow Task . 此时,控制流选项卡应该如屏幕截图所示#

    9. 在数据流任务中,放置 OLE DB Source 9 以及# 11 . 这将从基于给定站点的表中获取数据。点击 按钮设置查询参数。

    10. 如果表字段数据类型是VARCHAR格式,那么我们需要将其转换为NVARCHAR(unicode格式),否则就不需要这个步骤。在数据流任务中,放置 Data Conversion 12 .

    11. 13 .

    12. 14 15 16 然后单击“确定”。在屏幕截图中显示警告时# ,单击“确定”。选择值 模板 如屏幕截图所示的下拉列表# . 如屏幕截图所示配置列# 19

    13. 在SSIS包的连接管理器上,选择新创建的Excel连接管理器,然后按F4键查看属性。更改 姓名 Excel . 改变 延迟验证 这样,如果文件Template.xls不存在,就不会收到错误消息。设置 服务器名 有值表达式 @[USer::ExcelFilePath] 20 NOTE: 应在路径C:\temp\Template.xls中创建Excel文件。您可能希望保存它,以便在将来的设计更改中不会遇到它。如果文件被删除,您仍然可以重新创建它。

    14. 21 . 一旦配置了数据流任务,它应该如屏幕截图所示# 22

    15. 回到controlflow选项卡,在Foreach循环容器中配置executesql任务,如屏幕截图所示# 23

    16. 24 显示文件夹c:\temp中的内容\ 包的执行。

    17. 25 以及# 26

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

    19. 截图# 28 29 显示新创建的Excel电子表格North.xls和South.xls的内容。两张表都包含了各自同名站点的数据。

    ExcelSheet变量值:

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

    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

    截图4:

    4

    截图5:

    5

    6

    截图7:

    7

    8

    截图9:

    9

    截图#10:

    10

    11

    12

    截图#13:

    13

    截图#14:

    14

    15

    截图#16:

    16

    17

    截图18:

    18

    截图19:

    19

    截图20:

    20

    截图#21:

    21

    22

    23

    截图#24:

    24

    25

    截图26:

    26

    截图#27:

    27

    截图#28:

    28

    29

        2
  •  1
  •   K Richard    15 年前

    我认为SSIS是一个很好的工具,您有两个选择。

    我会这样做:

    1) 我将创建两个MS Excel文件,其中包含我希望看到的所有数据。删除数据并将其作为模板文件保存,并为完整文件制作一个副本。

    2) 在连接管理器中设置到这些文件的文件连接。

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

    4) 添加数据流任务,并在其中放入一个OLEDB源、一个多播、两个条件拆分和两个MS Excel目标。

        3
  •  1
  •   Sam    15 年前

    不确定这是否可行,但将所有条件查询与另一个文件名字段放在一个表中。然后使用for循环遍历其中的每一个,并动态修改transform任务的select子句。SSIS调用这些动态修改-表达式。

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

    http://codebetter.com/blogs/raymond.lewallen/archive/2005/05/04/62781.aspx

        4
  •  1
  •   harry    9 年前

    我有一个64位和32位的问题,他们不兼容,因为我的系统是64位的。