在这篇文章中 微软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 文件的方法