微软BI 之SSIS 系列 - 两种将 SQL Server 数据库数据输出成 XML 文件的方法
开篇介绍
在 SSIS 中并没有直接提供从数据源到 XML 的转换输出,Destination 的输出对象有 Excel File, Flat File, Database 等,但是并没有直接提供 XML 文件输出的配置。
但是我们仍然可以通过下面这些方法来实现:
方法一:在数据流中使用平面文件对字符串 XML 转换输出
方法二:在控制流中使用 Script Task 输出 XML 文件
需求描述
要将下面的这种查询结果转换成 XML -

需要输出成 XML 文件的格式 -

那么首先在SQL 语句中就需要将格式转换一下,可以将将查询结果包装成相应的 XML 格式 -
SELECT *
FROM T009_SALES_ORDER_DETAIL
FOR XML RAW('SalesOrderDetail'),ROOT('SalesOrder'),ELEMENTS
关于 SQL XML 查询的内容,不是文本的重点,大家可以参考博客园中其他博友的博客:
在数据流中使用平面文件对字符串 XML 转换输出
在 Data Flow 中新建一个 Source 并且使用上面的 SQL 语句,这个 SQL 语句查询的结果是一个 XML 格式的大字符串。

它的 Columns 输出的就是包含了整个 XML 结果的字符串。

为了兼容后面文件输出时的字符类型转换问题,添加一个 Data Convertion 将这个输出改变一下数据类型,这里选择的是 Unicode text stream [DT_NTEXT]。

新建一个 Flat File Connection Manager,文件后缀名称是 .xml 结尾。如果测试环境是中文,或者输出的字符串中有双字节字符类型,那么就应该在 Locale 选择适当的环境语言,并且应该勾选上 Unicode。

并且在 Advanced 中新增加一个 Column,并且一定要注意在类型中应该选择的应该是 Unicode text stream。并且这也就是要用 Flat File Connection 而不使用 Raw File 的原因,因为 Raw File 中不支持 Text 文本数据类型。

新建一个 Flat File Destination 组件,并且使用上面编辑好了的 Flat File Connection Manager。

使用刚才在 Data Conversion 中编辑过的新 Column 与输出 Column 匹配。

保存并执行 SSIS Package。

你认为一定成功了,对吧!打开一看,傻眼了吧!

原因是什么呢?我们可以回到 OLE_SRC_OrderDetail 中 Preview 一下,看到了吗?在这里这个输出是Byte字节数组。

需要将上面的 SQL 再次包装成 XML 一下,将这个查询结果单独包装成一个字符串格式。
SELECT
(
SELECT TOP 10
[SalesOrderID]
,[SalesOrderDetailID]
,[CarrierTrackingNumber]
,[OrderQty]
,[ProductID]
,[UnitPrice]
,[UnitPriceDiscount]
,[ModifiedDate]
FROM [Sales].[SalesOrderDetail]
FOR XML RAW('SalesOrderDetail'),ROOT('SalesOrder'),ELEMENTS
)AS XML_Order
不包装时在 SQL Server 中的查询结果可以理解它是一个正儿八经的 XML 文件,点击打开就是一整个 XML 格式的文本 -

包装之后在 SQL Server 中的查询结果 - 这才是真正的文本数据。

再次 Preview 一下,看到 XML 格式的字符串。

修改后面的 Mapping 关系,并保存执行输出,在浏览器中查看 XML 文件结果。


在控制流中使用 Script Task 输出 XML 文件
新建两个变量,一个保存文件路径,另一个保存 XML 字符串。

注意这时使用的是 Execute SQL Task 是一个控制流控件, SQL Statement 中使用上面那个包装过的 XML 查询。

Result Set 中将输出的 XML 结果用上面新建的变量来保存。

新建一个 Script Task 传入两个变量。

Script 中引用 System.IO 命名空间,然后就是下面这几句代码。
public void Main()
{
string content = Dts.Variables["User::XmlString"].Value.ToString();
string filePath = Dts.Variables["User::XmlFilePath"].Value.ToString();
StreamWriter writer = new StreamWriter(filePath);
writer.WriteLine(content);
writer.Close(); Dts.TaskResult = (int)ScriptResults.Success;
}
保存执行并查看输出的 XML 文件。

输出的结果有一个 ROOT ,这可以在代码中非常容易的处理掉。
string content = Dts.Variables["User::XML_STRING"].Value.ToString().Replace("<ROOT>", "").Replace("</ROOT>", "");

PS : 更新补充一下不使用 SSIS 工具直接通过 SQL 输出到文件的方式 - XP_CMDSHELL
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO EXEC XP_CMDSHELL 'BCP "SELECT(SELECT TOP 2 * FROM [AdventureWorks2012].[Sales].[SalesOrderDetail] FOR XML RAW(''SalesOrderDetail''),ROOT(''SalesOrder''),ELEMENTS )AS XML_Order " QUERYOUT "D:\text.xml" -c -T' EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 0
GO
RECONFIGURE
GO
这样也是可以的,但是一般情况下至少我很少选择这种方式,原因主要有几个:
1. XP_CMDSHELL 默认被禁用的,要使用 sp_configure 来控制,因此需要级别比较高的权限,但是在实际操作中客户在很多时候不会给那么多的权限。
2. 很重要的一点就是在 BI 当中,我们所有的文件输出一定有日志的记录,包括输出路径,起始时间,文件大小等等,使用 SSIS 可以更好的跟 Process Log 结合起来使用。
3. 如果是一些比较复杂的 SQL 查询输出,在 SQL 中拼接字符串也是一件非常痛苦的事情。
更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。
微软BI 之SSIS 系列 - 两种将 SQL Server 数据库数据输出成 XML 文件的方法的更多相关文章
- 微软BI 之SSIS 系列 - 通过 ROW_NUMBER 或 Script Component 为数据流输出添加行号的方法
开篇介绍 上午在天善回答看到这个问题 - SSIS 导出数据文件,能否在第一列增加一个行号,很快就帮助解决了,方法就是在 SQL 查询的时候加一个 ROW_NUMBER() 就可以了. 后来想起在两年 ...
- 微软BI 之SSIS 系列 - Execute SQL Task 中的 Single Row 与 Full Result Set 的处理技巧
开篇介绍 Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件. 我们通常使用 Execute SQL ...
- 微软BI 之SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式
开篇介绍 关于 Slowly Changing Dimension 缓慢渐变维度的理论概念请参看 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型 ...
- 微软BI 之SSIS 系列 - 再谈Lookup 缓存
开篇介绍 关于 Lookup 的缓存其实在之前的一篇文章中已经提到了 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache ...
- 微软BI 之SSIS 系列 - 使用 Script Component Destination 和 ADO.NET 解析不规则文件并插入数据
开篇介绍 这一篇文章是 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧 的续篇,在上篇文章中介绍到了对于这种不规则文件输出的处理方式.比如下图中 ...
- 微软BI 之SSIS 系列 - Lookup 中的字符串比较大小写处理 Case Sensitive or Insensitive
开篇介绍 前几天碰到这样的一个问题,在 Lookup 中如何设置大小写不敏感比较,即如何在 Lookup 中的字符串比较时不区分大小写? 实际上就这个问题已经有很多人提给微软了,但是得到的结果就是 C ...
- 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧
案例背景与需求介绍 之前做过一个美国的医疗保险的项目,保险提供商有大量的文件需要发送给比如像银行,医疗协会,第三方服务商等.比如像与银行交互的 ACH 文件,传送给协会的 ACH Credit 等文件 ...
- 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug
开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配 ...
- 微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件
原文:微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件 开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent ...
随机推荐
- 性能测试二十八:环境部署之Dubbo部署
Zookeeper部署 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一 ...
- Type in Chakra
Type in Chakra Javascript是一个无类型的语言. 我们要讨论的类型是指Chakra内置的一些数据结构,这些结构维护了Object的信息. Type在一类Object中共享数据,使 ...
- node.js开发博客系统---前端项目搭建(一)
Express: https://github.com/petecoop/generator-express 安装node.js和npm 执行: npm install -g yo npm insta ...
- 《Java程序性能优化》之设计优化
豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞 ...
- python学习之python安装
1.下载python源码包 wget https://www.python.org/ftp/python/3.5.5/Python-3.5.5.tar.xz 2.下载 xz yum -y insta ...
- 决策树分类算法及python代码实现案例
决策树分类算法 1.概述 决策树(decision tree)——是一种被广泛使用的分类算法. 相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置 在实际应用中,对于探测式的知识发现 ...
- Immediate Decodability HDU1305
类似phonelist 一次ac 判断失败主要有两个要点 1. 是否包含了某段的结尾结点 说明某段被此段包含 2.此段的结尾结点是否为某段的痕迹 说明此段被包含 #include<bi ...
- 【Java】 剑指offer(55-2) 平衡二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一棵二叉树的根结点,判断该树是不是平衡二叉树.如果某二叉树 ...
- 几个文本处理工具的简单使用(wc,cut,sort,uniq,diff和patch)
wc wc命令用于报告文本文件的一些统计计数,例如行数.单词数.字节数等. 语法如下. wc [OPTION]... [FILE]... wc [OPTION]... --files0-from=F ...
- Metasploit AFP爆破模块afp_login
Metasploit AFP爆破模块afp_login AFP是苹果系统支持的文件服务.用户可以使用指定的账户名和密码进行远程文件管理.afp_login是一个AFP认证信息暴力破解模块.它支持对 ...