SSIS在整个SQL Server的BI 平台中的定位是ETL解决方案,它的前身是SQL Server 2000的DTS(Data Transfomation Service),但较之DTS,有了很大的改变和增强:它是完全基于.NET编写的,并且提供了完整的服务、运行引擎、异常处理、跟踪日志、扩展机制等等。
有关SSIS的完整内容,如果有兴趣,应该参考有关的书籍,或者参加有关的培训学习。
本文主要讲解一下,如何在SSIS中使用Web Service,这是我经常被问到的问题:因为在做数据集成的时候,数据源系统可能没有办法让我们直接访问数据库。但是他们可以公开一些服务,这样我们就可以通过访问这些Web Service对其进行读取和整合。
1. 作为演示目的,我写了一个很简单的服务。模拟的是人事系统,它通过Web Service的方式将最新的员工信息发布出来。
点击”GetEmployees” 链接
点击“调用”按钮
我这里只是简单地随机产生了100个员工,包括了ID,Name,Gender,WorkYears,Groups等信息
这个服务的代码如下
using System; using System.Web.Services; using System.Data; namespace HRService { /// <summary> /// 这个服务模拟了一个人事系统,它将最新的员工列表发布出来 /// 作者:陈希章 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class EmployeeService : System.Web.Services.WebService { [WebMethod( Description="这个服务取得所有的员工")] public DataSet GetEmployees() { DataSet ds = new DataSet(); DataTable tb = new DataTable("Employees"); tb.Columns.Add("ID"); tb.Columns.Add("Name"); tb.Columns.Add("Gender"); tb.Columns.Add("WorkYears"); tb.Columns.Add("Group"); Random rnd=new Random(); for (int i = 0; i < 100; i++) { DataRow row = tb.NewRow(); row[0] = i+100; row[1] = "员工" + i.ToString(); row[2] = i % 5 == 0 ? "男" : "女"; row[3] = rnd.Next(20); row[4] = "班组" + i % 9; tb.Rows.Add(row); } ds.Tables.Add(tb); return ds; } } }
2. 创建一个SSIS包,准备使用Web Service任务项去调用该服务
我们从工具箱中,拖拽一个”Web服务任务”到“控制流”的空白区域
选中该任务,点击右键,“编辑”
点击”HttpConnection”右侧的下拉按钮,选择“新建连接”
【注意】这里的服务器Url应该带有wsdl后缀,因为等一下可以利用这个路径生成一个本地的wsdl文件
我们这里没有使用凭据。需要说明一下的是,“Web服务任务”能够使用的凭据只有两种:匿名或者基本验证。
何时使用证书?如何我们的服务是用WSE做了安全控制的话。
点击“测试连接”,确保它是成功的
点击“确定”,“确定”退出连接管理器设置界面
在“WSDLFile”这里面输入一个临时路径,例如:E:\TEMP\Employee.wsdl
点击“下载WSDL”按钮, 如果不出意外的话,应该可以看到下面的提示
这个操作其实是产生了一个wsdl文件,我们可以打开来看一下
顾名思义,WSDL是对服务进行了描述。为什么需要描述呢?就是后续需要用到里面的信息进行设置。
接下来,我们转到“输入”这个页面
依次在右侧选择Service和Method
【注意】第三行有些乱码,是因为对中文支持不好,可以不予理会
这样,我们就完成了输入设置,也就是可以连接到Web Service了。
3. 如何将获取到的数据进行保存或者处理呢?
我们可以转到“输出”页面
它支持两种输出类型:文件连接或者变量
我们先用“文件连接”来接受输出,然后点击”File”右侧的小下拉箭头,点击“新建连接”
我们让它创建一个新的文件,保存在临时目录下。点击“确定”后即可完成该任务的配置
4. 测试任务运行。
选中“Web服务任务”,点击右键,“执行任务”
如果不出意外的话,该任务能够成功执行。
5. 查看结果。我们打开保存的那个文件,可以看到,这是一个标准的XML文件,证明我们已经把数据下载下来了。
结束语:我们现在已经通过“Web服务任务”成功地完成了服务的调用,并且将结果保存为一个本地文件。那么,怎么处理该文件,并将其数据上传到我们的数据仓库中去呢?
这个问题在下一篇讲解
上一篇,我们讲到了通过Web服务任务将异构系统中的数据保存为一个XML文件。它们看起来是这样
但问题在于,我们如何处理该XML文件,并将其提交到我们的数据库中去呢?我们这一篇文章会用到XML任务和XML源对其进行转换和加载
1. 首先,拖拽一个“XML任务”到控制流中,并且设置好它与“Web服务任务”的优先约束
2. 编辑该任务(右键=》“编辑”
XML任务是很强大的,它可以做如下的事情
- 验证文档
- 比较文档
- 合并文档
- 转换文档
- 查找数据或者运算
我们这里选择XSLT,因为我们想对数据进行一些转换,现在下载下来的数据太复杂了:有命名空间,而且有很多没必要的元素。
在继续操作之前,我们需要准备一个XSLT文件。
3. 编写一个XSLT文件
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"
><!--这里添加一个特殊的命名空间,因为来源XML文件中有这个名称-->
<xsl:output method="xml" indent="yes"/><!--我们仍然输出为XML-->
<xsl:template match="/DataSet/diffgr:diffgram/NewDataSet">
<Employees><!--这是我们自定义输出文档里面的根元素-->
<xsl:for-each select="Employees">
<!--循环/DataSet/diffgr:diffgram/NewDataSet下面所有的Employees元素-->
<Employee>
<ID>
<xsl:value-of select="ID"/>
</ID>
<Name>
<xsl:value-of select="Name"/>
</Name>
<Gender>
<xsl:value-of select="Gender"/>
</Gender>
<WorkYears>
<xsl:value-of select="WorkYears"/>
</WorkYears>
<Group>
<xsl:value-of select="Group"/>
</Group>
</Employee>
</xsl:for-each>
</Employees>
</xsl:template>
</xsl:stylesheet>
将该文件保存到一个目录,例如E:\Temp目录
4. 使用该文件对Employee.XML进行转换。
我们回到SSIS包的设计器中。
【注意】Source这里设置的是数据来源文件
将“SaveOperationResult”设置为true
展开“OperationResult”这个节点
设置Destination
点击“确定”
在“第二操作数”处,选择“SecondOperatedType”为文件连接,并选择SecondOperand为“Employee.xslt”。其实就是我们的转换文件
点击“确定”
5. 调试该任务。选中它,右键,执行任务
6. 检查输出文件。我们可以去打开那个Output.xml。这个文件显然更加易于理解和处理了
结语:这一篇,我们通过XML任务对一个XML数据文件进行了转换。那么怎么把这个数据最终提交打数据库去呢?下一篇将介绍使用XML源来实现该需求
上一篇我们讲到了如何实现XML文档的转换。那么如何将这些规范的数据导入到数据库中去呢?本节我们讲解使用XML源来实现该需求
1. 添加数据流任务,并设置其与XML任务的优先约束
2. 编辑数据流任务
双击该任务
3. 添加XML源
4. 编辑该组件
点击“生成XSD”。然后点击“列”
可以看到,它现在检测到了五个列。
到这里为止,我们就完成了XML源的设置
5. 添加数据目标
我们希望将这些数据传输到其他数据存储中去。作为演示目的,我们这里直接使用简单一点的Excel作为目标
编辑该目标
在“OLEDB连接管理器”这边点击“新建”
点击“确定”
在”Excel工作表名称”这边点击“新建”
点击“确定”
点击一下左侧的“映射”
然后点击“确定”
6. 测试数据流
我们回到“控制流”的界面,选中“数据流任务”,右键,“执行任务”
7. 查看结果。我们去打开那个 Data.xls
在这里,我们看到的是一条一条的记录。
沒有留言:
張貼留言