2011年7月26日 星期二

在SSIS中使用Web Service任务进行集成

SSIS是SQL Server 2005新增的一个服务,全称是SQL Server Integration Service。中文一般翻译为:集成服务或者整合服务。
SSIS在整个SQL Server的BI 平台中的定位是ETL解决方案,它的前身是SQL Server 2000的DTS(Data Transfomation Service),但较之DTS,有了很大的改变和增强:它是完全基于.NET编写的,并且提供了完整的服务、运行引擎、异常处理、跟踪日志、扩展机制等等。
有关SSIS的完整内容,如果有兴趣,应该参考有关的书籍,或者参加有关的培训学习。
本文主要讲解一下,如何在SSIS中使用Web Service,这是我经常被问到的问题:因为在做数据集成的时候,数据源系统可能没有办法让我们直接访问数据库。但是他们可以公开一些服务,这样我们就可以通过访问这些Web Service对其进行读取和整合。
1. 作为演示目的,我写了一个很简单的服务。模拟的是人事系统,它通过Web Service的方式将最新的员工信息发布出来。
image
点击”GetEmployees” 链接
image
点击“调用”按钮
image
我这里只是简单地随机产生了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任务项去调用该服务
image
我们从工具箱中,拖拽一个”Web服务任务”到“控制流”的空白区域
image
选中该任务,点击右键,“编辑”
image
点击”HttpConnection”右侧的下拉按钮,选择“新建连接”
image
【注意】这里的服务器Url应该带有wsdl后缀,因为等一下可以利用这个路径生成一个本地的wsdl文件
我们这里没有使用凭据。需要说明一下的是,“Web服务任务”能够使用的凭据只有两种:匿名或者基本验证。
何时使用证书?如何我们的服务是用WSE做了安全控制的话。

点击“测试连接”,确保它是成功的
image
点击“确定”,“确定”退出连接管理器设置界面
image
在“WSDLFile”这里面输入一个临时路径,例如:E:\TEMP\Employee.wsdl
image
点击“下载WSDL”按钮, 如果不出意外的话,应该可以看到下面的提示
image
这个操作其实是产生了一个wsdl文件,我们可以打开来看一下
image
顾名思义,WSDL是对服务进行了描述。为什么需要描述呢?就是后续需要用到里面的信息进行设置。
接下来,我们转到“输入”这个页面
image
依次在右侧选择Service和Method
image
【注意】第三行有些乱码,是因为对中文支持不好,可以不予理会
这样,我们就完成了输入设置,也就是可以连接到Web Service了。

3. 如何将获取到的数据进行保存或者处理呢?
我们可以转到“输出”页面
image
它支持两种输出类型:文件连接或者变量
我们先用“文件连接”来接受输出,然后点击”File”右侧的小下拉箭头,点击“新建连接”
image
我们让它创建一个新的文件,保存在临时目录下。点击“确定”后即可完成该任务的配置

4. 测试任务运行。
image
选中“Web服务任务”,点击右键,“执行任务”
image
如果不出意外的话,该任务能够成功执行。

5. 查看结果。我们打开保存的那个文件,可以看到,这是一个标准的XML文件,证明我们已经把数据下载下来了。
image



















结束语:我们现在已经通过“Web服务任务”成功地完成了服务的调用,并且将结果保存为一个本地文件。那么,怎么处理该文件,并将其数据上传到我们的数据仓库中去呢?
这个问题在下一篇讲解

上一篇,我们讲到了通过Web服务任务将异构系统中的数据保存为一个XML文件。它们看起来是这样
image
但问题在于,我们如何处理该XML文件,并将其提交到我们的数据库中去呢?我们这一篇文章会用到XML任务和XML源对其进行转换和加载
1. 首先,拖拽一个“XML任务”到控制流中,并且设置好它与“Web服务任务”的优先约束
image
2. 编辑该任务(右键=》“编辑”
image
XML任务是很强大的,它可以做如下的事情
  • 验证文档
  • 比较文档
  • 合并文档
  • 转换文档
  • 查找数据或者运算
这五个操作分别就对应了几个不同的OperationType
image
我们这里选择XSLT,因为我们想对数据进行一些转换,现在下载下来的数据太复杂了:有命名空间,而且有很多没必要的元素。
image
在继续操作之前,我们需要准备一个XSLT文件。

3. 编写一个XSLT文件
image
<?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包的设计器中。
image 
【注意】Source这里设置的是数据来源文件
 
将“SaveOperationResult”设置为true
展开“OperationResult”这个节点
 
设置Destination
image 
点击“确定”
在“第二操作数”处,选择“SecondOperatedType”为文件连接,并选择SecondOperand为“Employee.xslt”。其实就是我们的转换文件
image

点击“确定”

5. 调试该任务。选中它,右键,执行任务
image

6. 检查输出文件。我们可以去打开那个Output.xml。这个文件显然更加易于理解和处理了
image

结语:这一篇,我们通过XML任务对一个XML数据文件进行了转换。那么怎么把这个数据最终提交打数据库去呢?下一篇将介绍使用XML源来实现该需求

上一篇我们讲到了如何实现XML文档的转换。那么如何将这些规范的数据导入到数据库中去呢?本节我们讲解使用XML源来实现该需求
1. 添加数据流任务,并设置其与XML任务的优先约束
image
2. 编辑数据流任务
双击该任务
image
3. 添加XML源
image
4. 编辑该组件
image
点击“生成XSD”。然后点击“列”
image
可以看到,它现在检测到了五个列。
到这里为止,我们就完成了XML源的设置

5. 添加数据目标
我们希望将这些数据传输到其他数据存储中去。作为演示目的,我们这里直接使用简单一点的Excel作为目标
image
编辑该目标
image
在“OLEDB连接管理器”这边点击“新建”
image
点击“确定”
在”Excel工作表名称”这边点击“新建”
image
点击“确定”
点击一下左侧的“映射”
image
然后点击“确定”

6. 测试数据流
我们回到“控制流”的界面,选中“数据流任务”,右键,“执行任务”
image

7. 查看结果。我们去打开那个 Data.xls
image
在这里,我们看到的是一条一条的记录。

沒有留言:

張貼留言