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()
)
/project/allsqlserver/resources/3555C535-5106-536C-A75E-D39A6462B098.webp
在源数据库中插入数据:
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')
/project/allsqlserver/resources/47FF2F3B-EF8E-58FA-A1DF-BFA7C1F66B35.webp
2.创建FTP网站MySSISWebSite,如果未安装FTP支持,请开启FTP的功能:
/project/allsqlserver/resources/D98859F7-0F74-5C53-A83B-11657136F49D.webp
同时创建相应文件夹,如下图,FTP是网站文件夹,Local是本地需要同步的文件夹:
/project/allsqlserver/resources/10A35CC5-220E-572C-AF98-D8DB95EC9F17.webp
创建FTP网站:
/project/allsqlserver/resources/3FF1CA1D-0EBC-55CF-8DB6-92321A2672D8.webp
/project/allsqlserver/resources/1BB74AF6-E1F7-501B-84E5-324ECF0E6061.webp
在FTP文件下添加几个测试文件:
/project/allsqlserver/resources/D01A9DAE-7764-5D3E-BBAB-9D91B023F0D7.webp
至此,我们的准备工作就完成了。
在BIDS(Business Intelligence Development Studio )中创建SSIS项目MySSISProject
- 创建项目
/project/allsqlserver/resources/FEA5C80F-58E1-5746-BCDB-888E6CDA8FE9.webp
- 在默认的Package.dtsx中创建到数据库的链接
/project/allsqlserver/resources/73365DA6-0AAA-599D-B3EF-FBE7E093ED75.webp
按照同样的方式创建对MySSISLocalDb的链接:
/project/allsqlserver/resources/BD1F5124-4AB4-507A-836B-49E5C52A2C11.webp
- 在Control Flow中添加一个Sequence Container
- 在Sequence Container中添加一个Data Flow Task
/project/allsqlserver/resources/357D1DD6-231F-5C6F-9197-68E44FEC98EC.webp
- 双击此Data Flow Task进入编辑
- 添加Soure和Target:
/project/allsqlserver/resources/CB4B615A-3187-5877-BAF1-FF309B30CBB3.webp
/project/allsqlserver/resources/BD4DF0ED-1B4A-5EC0-8626-B18E5C0089C9.webp
同样的方式添加Target:
/project/allsqlserver/resources/D052885A-F0CA-5A9F-841A-41F3DC0E4F1A.webp
映射关系如下:
/project/allsqlserver/resources/CB7EF396-4B87-53DE-A39D-CBFE48280649.webp
最终Data Flow 如下
/project/allsqlserver/resources/8B7DF638-EA3D-5EC5-A84E-C71AB833DF42.webp
- 在Control Flow中添加Ftp Task
设置其Connetion为:
/project/allsqlserver/resources/A5B212A7-ABC9-5CE7-9C8C-6FA8BDBCA3D1.webp
创建变量,用于存储本地文件夹地址:
/project/allsqlserver/resources/D6026575-0B81-595A-8737-E9DFA8505539.webp
修改其属性:
/project/allsqlserver/resources/864E25E2-AB5A-592F-8A4A-91F6F4EC84FC.webp
此任务同步A.txt这个文件。
最终Control Flow 如下:
/project/allsqlserver/resources/3026D657-F3FC-5B11-99E8-EA7000F9D986.webp
在BIDS中运行
按F5开始运行:
/project/allsqlserver/resources/CBB8C80A-A3B6-50C7-938A-DAD707164C42.webp
上图表示运行结果成功。
在Execution Results 中可以查看结果:
/project/allsqlserver/resources/C2615E5F-36EE-57EA-8D86-B504938F26D1.webp
查询MySSISLocalDb可以获得相同的结果,代表数据已经成功的同步:
/project/allsqlserver/resources/F4AA52A5-CEE7-5C40-8680-86C5E0183225.webp
而Local文件夹也已经包含了A.txt文件:
/project/allsqlserver/resources/8AA53036-04F1-59D3-80E4-7AC686BAC567.webp
部署到SQL Server
通过SSMS创建SSIS的Catalog:
/project/allsqlserver/resources/9A2D05DA-B81A-57D1-A0ED-7E5119C88B95.webp
(需要输入加密需要用到的密码)
在解决方案管理中右击项目,选择Deploy开始部署向导 :
/project/allsqlserver/resources/DEF0E654-1C55-5776-9A5D-0B6559EEF196.webp
/project/allsqlserver/resources/3B3FF3AD-6E6E-57FE-B0F4-188C7EF5F8C3.webp
/project/allsqlserver/resources/735548F6-04DA-531C-9428-125BDC75E90E.webp
/project/allsqlserver/resources/5E2468CD-29C1-545F-B0B2-7B42B81A8763.webp
部署成功!
在SSMS中管理运行Package
用SSMS查看/管理/运行部署的Package:
/project/allsqlserver/resources/C5656096-3F47-584C-88C7-6265E9B97326.webp
/project/allsqlserver/resources/087D00B5-E68E-5F02-AFDF-F2D742DA36D2.webp
/project/allsqlserver/resources/B638D7DF-03F4-534B-A219-07C66B313BE3.webp
在SSMS中运行Package:
/project/allsqlserver/resources/46302600-21A5-50B9-BAD0-C872EDD88795.webp
点击Ok开始运行:
/project/allsqlserver/resources/3C28B22B-008F-5EAA-BA73-B25F2762FC54.webp
点击Yes可以查看运行的结果报表:
/project/allsqlserver/resources/8916317F-CC68-5BA1-812A-069688DEBC23.webp
在SQL Server Agent中创建Job周期性的运行Package
/project/allsqlserver/resources/89708B58-493D-5995-9A01-8A347A18A628.webp
Steps中添加SSIS的Package:
/project/allsqlserver/resources/0209DF47-A99A-5F45-AFE8-D0C2D1B76B39.webp
添加Schedule:
/project/allsqlserver/resources/CFA3E1DA-1118-525D-83A0-9DD73B7890F3.webp
可以查看Job的状态:
/project/allsqlserver/resources/FAA0F01D-D7AE-58B8-A8B9-C69FE12C52F1.webp
更多说明
如果我们在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来实现:
/project/allsqlserver/resources/786BD6AB-EFC2-5B3F-BCD3-AF07907738CA.webp
结语
SSIS的功能很强大,本例仅给出基本的示例,更多的操作和流程大家可以继续去实践。