微软BI 之SSIS 系列 - 从 XML 文件中导入数据

浏览: 3245

在这篇文章中 微软BI 之SSIS 系列 - 两种将 SQL Server 数据库数据输出成 XML 文件的方法,讲解了 XML 的输出操作 - 控制流中的输出和数据流中的输出。尽管在 SSIS 中没有 XML Destination,但是 XML Source 还是有的。

具体实现步骤

新建一个包,在数据流中添加一个 XML Source。

双击并编辑 XML Source,我们的测试文件就来自于 微软BI 之SSIS 系列 - 两种将 SQL Server 数据库数据输出成 XML 文件的方法 中的例子。

下面会有一个警告 - XML Schema (XSD) is not specified. Select an existing XSD or click Generate XSD to create an XSD from the XML file。

关于 XSD 大家可以参看博客园一位博友的文章,点击查看。那么这里就直接点击 Generate XSD,它会自动根据你的 XML 文件格式为你创建一个 XML 描述文件。

这个文件生成的目录和你的 XML 源文件的目录是一致的。

中间的过程可能出现错误,比如 XML 源文件在我们的 SSIS 中无法解析,这时就会创建失败,也就无法使用 XML Source 进行数据抽取了。像下面的这个警告是没有太大问题的,因为它只是提示有些字段的长度可能需要注意,包括数据类型最好采用 DT_WSTR - 255长。

直接下一步可以看到 SSIS 内部对 XML 的解析之后的结果,可以看到各个不同的列。

当然这里要说一句的是 - 由于 XML 文件中的数据类型,包括长度无法确定的情况下,目标表上的列通常定义为字符串类型并给予合适的长度,以确保从 XML 到数据表这一加载过程是成功的。加载过程完成后,后期再来处理数据的类型,长度等。

目标表在这里的结构是 -

CREATE TABLE [dbo].[T010_SALES_ORDER_DETAIL](
[SalesOrderID] NVARCHAR(50) NOT NULL,
[SalesOrderDetailID] NVARCHAR(50) NOT NULL,
[OrderQty] NVARCHAR(50) NOT NULL,
[ProductID] NVARCHAR(50) NOT NULL,
[UnitPrice] NVARCHAR(50) NOT NULL,
[UnitPriceDiscount] NVARCHAR(50) NOT NULL,
[LineTotal] NVARCHAR(50) NOT NULL,
[rowguid] NVARCHAR(255) NOT NULL,
[ModifiedDate] NVARCHAR(50) NOT NULL
)

大家也可以尝试使用 XML Source 推荐的的数据表结构,可以看到它提供的推荐数据类型都和 XSD 文档定义的结构类型是相关的。

CREATE TABLE [dbo].[T010_SALES_ORDER_DETAIL](
[SalesOrderID] [bigint] NULL,
[SalesOrderDetailID] [bigint] NULL,
[OrderQty] [tinyint] NULL,
[ProductID] [int] NULL,
[UnitPrice] [decimal](28, 10) NULL,
[UnitPriceDiscount] [decimal](28, 10) NULL,
[LineTotal] [decimal](28, 10) NULL,
[rowguid] [nvarchar](255) NULL,
[ModifiedDate] [datetime] NULL
)

XSD 文档的定义。

<?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SalesOrder">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="SalesOrderDetail">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="SalesOrderID" type="xs:unsignedInt" />
<xs:element minOccurs="0" name="SalesOrderDetailID" type="xs:unsignedInt" />
<xs:element minOccurs="0" name="OrderQty" type="xs:unsignedByte" />
<xs:element minOccurs="0" name="ProductID" type="xs:unsignedShort" />
<xs:element minOccurs="0" name="UnitPrice" type="xs:decimal" />
<xs:element minOccurs="0" name="UnitPriceDiscount" type="xs:decimal" />
<xs:element minOccurs="0" name="LineTotal" type="xs:decimal" />
<xs:element minOccurs="0" name="rowguid" type="xs:string" />
<xs:element minOccurs="0" name="ModifiedDate" type="xs:dateTime" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

执行包的效果 -

对比在 微软BI 之SSIS 系列 - 两种将 SQL Server 数据库数据输出成 XML 文件的方法 文章中使用到的数据源表和这篇文章中的目标表,数据都是一样的,条数也是一致的,那么我们的处理就完成了。

总结

在这里要说一下,并不是每一个 XML 文件都能顺利的解析成功的。在我以往的项目中,我遇到过来自上游程序或者客户创建的 XML 文件,有的格式的确是无法解析的,并且内容和格式也是非常复杂的。

对于无法解析的 XML 文件,通常会直接告诉他们这种 XML 文件无法解析,数据在 SSIS 中读取不出来。客户一般会重新处理 XML 文件,发送一个能够解析的并将此文件作为标准的通信文件与 BI 系统进行交互。

与 XML 相关的文章还有

微软BI 之SSIS 系列 - 两种将 SQL Server 数据库数据输出成 XML 文件的方法

推荐 0
本文由 BIWORK 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

2 个评论

您好,博主。在实际操作中发现有些XML文件格式错误或者为空,像这种情况要如何忽略掉不能正常解析的XML源,让剩下的继续正常解析呢?(实际操作中XML源是来自数据库的一个字段,这个字段可能为null也可能不是xml或者错误的xml)我有试过更改XML源编辑器中的错误输出和截断都为“忽略错误”发现并不起作用,请问一下博主有什么好的方法吗?
博主,您好:
我的XML源数据来自数据库的一个字段,这个字段里面会含有一些null值和一些格式不正常的数据,我在解析的时候希望忽略掉这些非常之数据,应该怎么操作呢?我已经尝试过更改xml源里面的错误和截断重定向为“忽略错误”,也尝试增加错误输出,但是这些都没有用,数据流在XML源步骤就会挂掉,有什么办法使错误的数据自动忽略,正确的数据继续解析呢?期待您的解惑,谢谢。

要回复文章请先登录注册