微软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 ...
随机推荐
- 双线程 线性dp 传纸条
/* 两种做法:一是暴力dp[i][j][k][l] 二是以走的步数k作为阶段, dp[k][i][j]表示走到第k步,第一个人横坐标走到i,第二个人横坐标走到j 可以以此推出第第一个人的坐标为[i, ...
- javaFX中解决填充(拉伸)问题
1.margin设置实现 在项目过程中,遇到此问题,如图: 如果窗口缩小,HBox(左边的包含TitledPane那部分)看不到底部 如果窗口拉大,下面就出现空白,HBox高度没拉神 办法:对包含HB ...
- Hibernate api 之常见的类(配置类,会话工厂类,会话类)
1:Configuration :配置管理类对象 1.1:config.configure(): 加载主配置文件的方法(hibernate.cfg.xml) ,默认加载src/hibernate.cf ...
- android 换行符(\n) 在TextView中显示不正常的问题
问题描述 在Android开发,使用TextView设置换行的时候,会有这种情况: 1.如果直接在XML文件中写入"aaaaa\nbbbb"可以换行,显示为: aaaaabbbbb ...
- mongodb 备份
本篇文章来自于阿里云技术专家郑涔(明俨)在2018年<Redis.MongoDB.HBase大咖直播大讲堂>技术直播峰会中的分享,该分享整体由四个部分构成: 1.MongoDB备份恢复 2 ...
- BZOJ1878 [SDOI2009]HH的项链 树状数组 或 莫队
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1878 题意概括 给出一个长度为n的序列,用m次询问,问区间Li~Ri中有多少种不同的数. 0< ...
- Java Web 之javabeans
Java遇见HTML——JSP篇之JavaBeans: http://www.cnblogs.com/Qian123/p/5277425.html
- 通过 DOM
通过 DOM,您可访问 HTML 文档中的每个节点. 查找并访问节点 你可通过若干种方法来查找您希望操作的元素: 通过使用 getElementById() 和 getElementsByTagNam ...
- HDU3915 Game 高斯消元
题目链接 HDU3915 Game 高斯消元 题解 求异或方程组自由元的子集个数 高斯消元求秩,内存溢出好神 代码 #include<bitset> #include<cstdio& ...
- Android监听view的attached或detached状态
我们在开发中,希望监听View的attached或detached状态,来进行比如eventbus的注册与解注册的操作,非常的方便实用. 可以使用系统给我们提供的listener,代码使用如下: mV ...