使用SQL Server Integration Services(SSIS)

Raymond Tang Raymond Tang 0 2056 0.41 index 11/5/2011

SQL Server中的SSIS作为BI的一部分,可以帮助我们将数据从一个数据源导出到另外一个地方,同时在这个过程中还可以对数据进行转换修改等;如果导入导出遇到错误,可以通过处理Error或者事件的进行相应处理;SSIS控制流程任务包括了数据流任务,还有发送Email,FTP等等常用的任务;我们可以通过事务或者Breakpoints来控制整个的流程的执行;为了保护敏感的数据,我们可以对SSIS的Package进行部分或者全部加密;为了更好的部署,SSIS在BIDS中提供可配置的功能(如XML配置,环境变量配置,Package继承配置,SQL Server配置,注册表配置等);SSIS的Package可以部署到服务器上的文件系统中或者SQL Server 中,需要服务器运行SSIS的服务,如果使用了事务,需要MSDTS服务也同时运行;部署后我们可以通过数据库角色或者文件系统权限等对权限进行相应的控制;执行SSIS Package 可以通过命令行工具或者相应UI工具,还可以通过SSMS进行执行管理;我们还可以通过SQL Server Agent创建Job定期的执行SSIS的Package。

本文不会对SSIS的每个细节进行阐述,而是通过一个例子来运用SSIS;本例将运用SSIS周期性的同步远程的SQL Server数据库到本地的数据库,同时通过FTP对某一文件夹进行数据的同步,最终将任务部署在SQL Server中并且每天运行。

准备工作

1.创建源数据库MySSISSourceDb以及本地数据库MySSISLocalDb(本例均创建在我的PC上);同时初始化数据表Notes,SQL 语句如下:

create table Notes   
(    
NoteID int not null identity primary key,    
NoteTile varchar(50) not null,    
NoteAddDate datetime not null default getdate()    
)

https://api.kontext.tech/resource/3555c535-5106-536c-a75e-d39a6462b098

在源数据库中插入数据:

insert into dbo.Notes(NoteTile) values('Test Note 1')   
insert into dbo.Notes(NoteTile) values('Test Note 2')    
insert into dbo.Notes(NoteTile) values('Test Note 3')    
insert into dbo.Notes(NoteTile) values('Test Note 4')

https://api.kontext.tech/resource/47ff2f3b-ef8e-58fa-a1df-bfa7c1f66b35

2.创建FTP网站MySSISWebSite,如果未安装FTP支持,请开启FTP的功能:

https://api.kontext.tech/resource/d98859f7-0f74-5c53-a83b-11657136f49d

同时创建相应文件夹,如下图,FTP是网站文件夹,Local是本地需要同步的文件夹:

https://api.kontext.tech/resource/10a35cc5-220e-572c-af98-d8db95ec9f17

创建FTP网站:

https://api.kontext.tech/resource/3ff1ca1d-0ebc-55cf-8db6-92321a2672d8

https://api.kontext.tech/resource/1bb74af6-e1f7-501b-84e5-324ecf0e6061

在FTP文件下添加几个测试文件:

https://api.kontext.tech/resource/d01a9dae-7764-5d3e-bbab-9d91b023f0d7

至此,我们的准备工作就完成了。

在BIDS(Business Intelligence Development Studio )中创建SSIS项目MySSISProject

  • 创建项目

https://api.kontext.tech/resource/fea5c80f-58e1-5746-bcdb-888e6cda8fe9

  • 在默认的Package.dtsx中创建到数据库的链接

https://api.kontext.tech/resource/73365da6-0aaa-599d-b3ef-fbe7e093ed75

按照同样的方式创建对MySSISLocalDb的链接:

https://api.kontext.tech/resource/bd1f5124-4ab4-507a-836b-49e5c52a2c11

  • 在Control Flow中添加一个Sequence Container
  • 在Sequence Container中添加一个Data Flow Task

https://api.kontext.tech/resource/357d1dd6-231f-5c6f-9197-68e44fec98ec

  • 双击此Data Flow Task进入编辑
  • 添加Soure和Target:

https://api.kontext.tech/resource/cb4b615a-3187-5877-baf1-ff309b30cbb3

https://api.kontext.tech/resource/bd4df0ed-1b4a-5ec0-8626-b18e5c0089c9

同样的方式添加Target:

https://api.kontext.tech/resource/d052885a-f0ca-5a9f-841a-41f3dc0e4f1a

映射关系如下:

https://api.kontext.tech/resource/cb7ef396-4b87-53de-a39d-cbfe48280649

最终Data Flow 如下

https://api.kontext.tech/resource/8b7df638-ea3d-5ec5-a84e-c71ab833df42

  • 在Control Flow中添加Ftp Task

设置其Connetion为:

https://api.kontext.tech/resource/a5b212a7-abc9-5ce7-9c8c-6fa8bdbca3d1

创建变量,用于存储本地文件夹地址:

https://api.kontext.tech/resource/d6026575-0b81-595a-8737-e9dfa8505539

修改其属性:

https://api.kontext.tech/resource/864e25e2-ab5a-592f-8a4a-91f6f4ec84fc

此任务同步A.txt这个文件。

最终Control Flow 如下:

https://api.kontext.tech/resource/3026d657-f3fc-5b11-99e8-ea7000f9d986

在BIDS中运行

按F5开始运行:

https://api.kontext.tech/resource/cbb8c80a-a3b6-50c7-938a-dad707164c42

上图表示运行结果成功。

在Execution Results 中可以查看结果:

https://api.kontext.tech/resource/c2615e5f-36ee-57ea-8d86-b504938f26d1

查询MySSISLocalDb可以获得相同的结果,代表数据已经成功的同步:

https://api.kontext.tech/resource/f4aa52a5-cee7-5c40-8680-86c5e0183225

而Local文件夹也已经包含了A.txt文件:

https://api.kontext.tech/resource/8aa53036-04f1-59d3-80e4-7ac686bac567

部署到SQL Server

通过SSMS创建SSIS的Catalog:

https://api.kontext.tech/resource/9a2d05da-b81a-57d1-a0ed-7e5119c88b95

(需要输入加密需要用到的密码)

在解决方案管理中右击项目,选择Deploy开始部署向导 :

https://api.kontext.tech/resource/def0e654-1c55-5776-9a5d-0b6559eef196

https://api.kontext.tech/resource/3b3ff3ad-6e6e-57fe-b0f4-188c7ef5f8c3

https://api.kontext.tech/resource/735548f6-04da-531c-9428-125bdc75e90e

https://api.kontext.tech/resource/5e2468cd-29c1-545f-b0b2-7b42b81a8763

部署成功!

在SSMS中管理运行Package

用SSMS查看/管理/运行部署的Package:

https://api.kontext.tech/resource/c5656096-3f47-584c-88c7-6265e9b97326

https://api.kontext.tech/resource/087d00b5-e68e-5f02-afdf-f2d742da36d2

https://api.kontext.tech/resource/b638d7df-03f4-534b-a219-07c66b313be3

在SSMS中运行Package:

https://api.kontext.tech/resource/46302600-21a5-50b9-bad0-c872edd88795

点击Ok开始运行:

https://api.kontext.tech/resource/3c28b22b-008f-5eaa-ba73-b25f2762fc54

点击Yes可以查看运行的结果报表:

https://api.kontext.tech/resource/8916317f-cc68-5ba1-812a-069688debc23

在SQL Server Agent中创建Job周期性的运行Package

https://api.kontext.tech/resource/89708b58-493d-5995-9a01-8a347a18a628

Steps中添加SSIS的Package:

https://api.kontext.tech/resource/0209df47-a99a-5f45-afe8-d0c2d1b76b39

添加Schedule:

https://api.kontext.tech/resource/cfa3e1da-1118-525d-83a0-9dd73b7890f3

可以查看Job的状态:

https://api.kontext.tech/resource/faa0f01d-d7ae-58b8-a8b9-c69fe12c52f1

更多说明

如果我们在Data Flow Task Error处理选择的Fail Component 那么在第二次运行的时候就会出现问题,因为自增长主键NoteID的缘故,比如如下:

[OLE DB Destination [2]] Error: SSIS Error Code DTS_E_OLEDBERROR.  An OLE DB error has occurred. Error code: 0x80004005.
An OLE DB record is available.  Source: "Microsoft SQL Server Native Client 11.0"  Hresult: 0x80004005  Description: "The statement has been terminated.".
An OLE DB record is available.  Source: "Microsoft SQL Server Native Client 11.0"  Hresult: 0x80004005  Description: "Violation of PRIMARY KEY constraint 'PK__Notes__EACE357F27098140'. Cannot insert duplicate key in object 'dbo.Notes'. The duplicate key value is (1).".

在这种情况下我们可以运用Conditional Split筛选没有同步的数据,同时对同步的数据进行更新处理即可;或者通过Lookup来实现:

https://api.kontext.tech/resource/786bd6ab-efc2-5b3f-bcd3-af07907738ca

结语

SSIS的功能很强大,本例仅给出基本的示例,更多的操作和流程大家可以继续去实践。

sql-server ssis

Join the Discussion

View or add your thoughts below

Comments