如何使用SSIS包将XML文件加载到数据库中?

时间:2011-03-01 09:34:58

标签: sql-server ssis business-intelligence

我在Visual Studio 2008中使用SSIS。我需要处理许多XML文件并放入现有的数据库结构(SQL Server 2005)。这是我第一次尝试使用SSIS而且有点卡住了。我找到了XML数据流任务,为它分配了一个测试xml文件,它与XSD相关联,并将一个节点映射到数据库表。我的问题是,如何将许多xsd节点与许多表相关联?当然,我不必为每个表设置XML源?

2 个答案:

答案 0 :(得分:44)

这是一个可能的选项,演示如何将具有相同定义的多个XML文件加载到SQL Server表中。该示例使用SQL Server 2008 R2SSIS 2008 R2。此处显示的示例在Data Flow Task组件的帮助下使用SSIS XML Source将三个XML文件加载到SQL表中。

分步流程:

  1. 使用 SQL Scripts 部分下提供的脚本创建名为dbo.Items的表。
  2. 使用 XSD文件部分下提供的内容,在文件夹路径 C:\ temp \ xsd 中创建名为Items.xsd的XSD文件。
  3. 使用下提供的内容在文件夹路径 C:\ temp \ xml 中创建三个XML文件,即Items_1.xmlItems_2.xmlItems_3.xml XML文件部分。
  4. 在包装上,创建3个变量,即FileExtensionFilePathFolderPath,如屏幕截图# 1 所示。
  5. 在程序包的连接管理器上,创建名为SQLServer的OLE DB连接以连接到SQL Server实例,如屏幕截图# 2 所示。
  6. Control Flow标签上,在Foreach循环容器中放置Foreach loop containerData Flow Task,如屏幕截图# 3 所示。
  7. 配置Foreach Loop container,如屏幕截图# 4 和# 5 所示。
  8. 双击Data Flow Task以导航至Data Flow标签。放置XML Source组件和OLE DB Destination,如屏幕截图# 6 所示。
  9. 配置XML Source,如屏幕截图# 7 和# 8 所示。将从变量 FilePath 中检索XML文件路径。此变量将由Foreach Loop container填充。
  10. 配置OLE DB Destination,如屏幕截图# 9 和# 10 所示。
  11. 屏幕截图# 11 和# 12 显示包的执行情况。
  12. 屏幕截图# 13 显示包包执行前的表格数据。屏幕截图# 14 显示包执行后的表数据。表dbo.Items中的数据现在包含三个XML文件中的数据。
  13. 希望有所帮助。

    SQL脚本:

    CREATE TABLE [dbo].[Items](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [ItemNumber] [nvarchar](50) NOT NULL,
        [ItemName] [nvarchar](60) NOT NULL,
        [Price] [numeric](18, 2) NOT NULL,
    CONSTRAINT [PK_Items] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
    GO
    

    XSD档案

    <xsd:schema xmlns:schema="ItemsXSDSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" targetNamespace="ItemsXSDSchema" elementFormDefault="qualified">
        <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
        <xsd:element name="Items">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element minOccurs="0" maxOccurs="unbounded" name="Item">
                        <xsd:complexType>
                            <xsd:sequence>
                                <xsd:element name="Id" type="sqltypes:int" />
                                <xsd:element name="ItemNumber">
                                    <xsd:simpleType>
                                        <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
                                            <xsd:maxLength value="20" />
                                        </xsd:restriction>
                                    </xsd:simpleType>
                                </xsd:element>
                                <xsd:element name="ItemName">
                                    <xsd:simpleType>
                                        <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
                                            <xsd:maxLength value="60" />
                                        </xsd:restriction>
                                    </xsd:simpleType>
                                </xsd:element>
                                <xsd:element name="Price">
                                    <xsd:simpleType>
                                        <xsd:restriction base="sqltypes:numeric">
                                            <xsd:totalDigits value="18" />
                                            <xsd:fractionDigits value="2" />
                                        </xsd:restriction>
                                    </xsd:simpleType>
                                </xsd:element>
                            </xsd:sequence>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
    </xsd:schema>
    

    XML文件

    <强> Items_1.xml

    <?xml version="1.0"?>
    <Items xmlns="ItemsXSDSchema">  
        <Item>
            <Id>1</Id>
            <ItemNumber>I2345343</ItemNumber>
            <ItemName>Monitor</ItemName>
            <Price>299.99</Price>
        </Item>
    </Items>
    

    <强> Items_2.xml

    <?xml version="1.0"?>
    <Items xmlns="ItemsXSDSchema">  
        <Item>
            <Id>1</Id>
            <ItemNumber>J1231231</ItemNumber>
            <ItemName>Mouse</ItemName>
            <Price>29.99</Price>
        </Item>
    </Items>
    

    <强> Items_3.xml

    <?xml version="1.0"?>
    <Items xmlns="ItemsXSDSchema">  
        <Item>
            <Id>1</Id>
            <ItemNumber>K0456212</ItemNumber>
            <ItemName>Keyboard</ItemName>
            <Price>49.99</Price>
        </Item>
    </Items>
    

    屏幕截图#1:

    1

    屏幕截图#2:

    2

    屏幕截图#3:

    3

    屏幕截图#4:

    4

    屏幕截图#5:

    5

    屏幕截图#6:

    6

    屏幕截图#7:

    7

    屏幕截图#8:

    8

    屏幕截图#9:

    9

    屏幕截图#10:

    10

    屏幕截图#11:

    11

    屏幕截图#12:

    12

    屏幕截图#13:

    13

    屏幕截图#14:

    13

答案 1 :(得分:1)

您还需要在数据流任务中将@[user::FilePath]添加到[XML Source].[XMLData],或者在程序包执行后将包添加找不到源文件