开篇介绍

在 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 查询的内容,不是文本的重点,大家可以参考博客园中其他博友的博客:

  1. SQL FOR XML
  2. 灵活运用 SQL SERVER FOR XML PATH

在数据流中使用平面文件对字符串 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 文件的方法的更多相关文章

  1. 微软BI 之SSIS 系列 - 通过 ROW_NUMBER 或 Script Component 为数据流输出添加行号的方法

    开篇介绍 上午在天善回答看到这个问题 - SSIS 导出数据文件,能否在第一列增加一个行号,很快就帮助解决了,方法就是在 SQL 查询的时候加一个 ROW_NUMBER() 就可以了. 后来想起在两年 ...

  2. 微软BI 之SSIS 系列 - Execute SQL Task 中的 Single Row 与 Full Result Set 的处理技巧

    开篇介绍 Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件. 我们通常使用 Execute SQL ...

  3. 微软BI 之SSIS 系列 - 数据仓库中实现 Slowly Changing Dimension 缓慢渐变维度的三种方式

    开篇介绍 关于 Slowly Changing Dimension 缓慢渐变维度的理论概念请参看 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型 ...

  4. 微软BI 之SSIS 系列 - 再谈Lookup 缓存

    开篇介绍 关于 Lookup 的缓存其实在之前的一篇文章中已经提到了 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache ...

  5. 微软BI 之SSIS 系列 - 使用 Script Component Destination 和 ADO.NET 解析不规则文件并插入数据

    开篇介绍 这一篇文章是 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧 的续篇,在上篇文章中介绍到了对于这种不规则文件输出的处理方式.比如下图中 ...

  6. 微软BI 之SSIS 系列 - Lookup 中的字符串比较大小写处理 Case Sensitive or Insensitive

    开篇介绍 前几天碰到这样的一个问题,在 Lookup 中如何设置大小写不敏感比较,即如何在 Lookup 中的字符串比较时不区分大小写? 实际上就这个问题已经有很多人提给微软了,但是得到的结果就是 C ...

  7. 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧

    案例背景与需求介绍 之前做过一个美国的医疗保险的项目,保险提供商有大量的文件需要发送给比如像银行,医疗协会,第三方服务商等.比如像与银行交互的 ACH 文件,传送给协会的 ACH Credit 等文件 ...

  8. 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug

    开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配 ...

  9. 微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件

    原文:微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件 开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent ...

随机推荐

  1. python 全栈开发,Day129(玩具开机提示语,为多个玩具发送点播,聊天界面,app录音,app与服务器端文件传输,简单的对话)

    一.玩具开机提示语 先下载github代码,下面的操作,都是基于这个版本来的! https://github.com/987334176/Intelligent_toy/archive/v1.2.zi ...

  2. JavaScript脚本的两种放置方式

    JavaScript脚本的两种放置方式 1在body里用 script标签引用 2 直接写在<script></script>标签之中

  3. django 2中的app_name和namespace

    最近看<精通DJANGO>里遇到的疑惑. 简书URL如下: https://www.jianshu.com/p/404500a0408a 其中的官方解释: 应用命名空间 它表示正在部署的应 ...

  4. 利用mysqldump 实现每天备份方案

    1.创建单独的导出导入数据库帐号 grant SELECT, RELOAD, SHOW DATABASES, LOCK TABLES on game to jackluo@localhost iden ...

  5. 2733: [HNOI2012]永无乡

    题解: 爬到了bzoj的数据哈哈哈哈 然后提交上去t了 自己测只有1秒多呀 不理解 然后这题目就是个线段树/平衡树合并裸题 来练一下线段树合并 据说是nlogn的 #include <bits/ ...

  6. IE下script标签的readyState属性

    在做加载器时遇到一个常见问题,如何判定一个脚本已经执行完毕. "uninitialized" – 原始状态 "loading" – 下载数据中 "lo ...

  7. Mysql 模糊匹配(字符串str中是否包含子字符串substr)

    1.LIKE 通常与 % 一同使用,类似于一个元字符的搜索.若substr不在str中,则返回0. 2.INSTR(str,substr) 返回字符串 str 中子字符串的第一次出现位置.若subst ...

  8. Unity 之 自定义消息提示框

    简单版: http://blog.csdn.net/caoshuangxiaodouya/article/details/46550655 复杂版: http://www.tuicool.com/ar ...

  9. hdu 2126 Buy the souvenirs 【输出方案数】【01背包】(经典)

    题目链接:https://vjudge.net/contest/103424#problem/K 转载于:https://blog.csdn.net/acm_davidcn/article/detai ...

  10. HDU 2048 神、上帝以及老天爷 【递推】【错排】

    题目链接 Problem Description HDU 2006'10 ACM contest的颁奖晚会隆重开始了!为了活跃气氛,组织者举行了一个别开生面.奖品丰厚的抽奖活动,这个活动的具体要求是这 ...