【问题标题】:How to load an XML file into a database using an SSIS package?如何使用 SSIS 包将 XML 文件加载到数据库中?
【发布时间】:2011-03-01 09:34:57
【问题描述】:

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

【问题讨论】:

  • 所有的XML文件都是同一个架构吗?
  • 目前存在一个 SSIS 错误,它阻止在 ssis 2008 中循环遍历 XML 文件.....但感谢您的解决方案。

标签: sql-server ssis business-intelligence


【解决方案1】:

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

分步过程:

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

希望对您有所帮助。

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:

屏幕截图 #2:

截图#3:

屏幕截图 #4:

屏幕截图 #5:

屏幕截图 #6:

截图#7:

截图#8:

屏幕截图 #9:

屏幕截图 #10:

屏幕截图 #11:

屏幕截图 #12:

屏幕截图 #13:

屏幕截图 #14:

【讨论】:

  • 注意xsd中的sqltypes。这让我的工作轻松多了!希望我早点找到这个答案!我正在使用具有常规类型的模式定义并且具有成功状态但没有输出任何行。更正 xsd 解决了这个问题!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-16
    • 2011-08-28
    • 2020-10-30
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    相关资源
    最近更新 更多