经常遇到批量数据导入问题,比如要定时把某一个目录中的所有EXCEL文件导入数据库,如果采用DTS导入方式,将很方便和快捷的处理好!
我以实际工作中一个用DTS导入例子详细讲解下,希望对大家对DTS导入方式有一个认识。
/*
有疑问可以联系:[email protected]
*/
/*
环境:数据库 SQL2000个人版 Office 2003
操作系统:Window 2000
本范例实现:某一个目录中一个Excel文件中数据导入多个表的功能,
可以扩充为某一个目录中所有Excle 文件定时导入到数据库中
*/
--A:首先:建包
展开SQL组->展开服务器->数据转换服务->本地包->右边栏目新建包
--B:然后建立包转换过程
1:数据源连接:
连接->Microsoft Excel 97-2000->输入:ExcelFile,选择默认数据源,本测试路径(D:/SZDATA/ExcelData/AppraiseData.xls)
2:数据目的连接:
连接->Microsoft OLE DB Provider for SQL Server -配置要导入目的数据库中的环境(略)
3:设置数据转换
任务->转换数据任务->连接ExcleFile 和 SQLSERVER->双击转换数据任务属性->
源:
选择SQL查询->输入 Select * from [sheet1$] (默认Excel 文件,可以根据自己环境更改)->此时可以用参数过滤要导入Excle数据条件,如:select * from [sheet1$] where STCD=? and TYPE=?,然后参数化两个参数,创建全局变量(很多地方均有相关介绍,略)
目的:
选择要导入的表
转换:
此时可以看到Excle 字段和数据库的对应关系。新建->数据转换的方式如下:(ActiveX script 、Copy Column、DateTime String、LowerCase string、Middle of String、等相关方式,笔者采用ActiveeXScript 方式)->选择源列(Excle 列)和目的列(数据库字段)之间导入关系->常规->属性-SQLSever此时给你生成基本的(Java 转换脚本)改脚本实现导入数据转换功能,如果您对脚本比较熟悉,可以自己添加自己想要的功能,如果不够熟悉,请务删除和添加该类脚本。然后确定->确定
查找:
选项:
主要用于生成导入日志文件,用户可以自定义
确定->完成
注意:该过程是把Excle的数据导入一个表中,由于笔者是把一个Excel文件导入7张表中,非一对一的关系,所以笔者需要重复上面的操作,配置好其它6个任务。略.
--C:创建全局变量
由于Excel文件名、服务器名、数据库名、文件路径均是一个变化的,所以必须要为该变量赋予参数化(全局变量参数化)
1:添加全局变量
右击包属性->全局变量->新建(名称:FileName、SeverName、DataBaseName)
(数据类型:String) (值:NULL)
如果要给Excel过滤导入数据,此时候为它也创建一个全局变量->确定
--D:全局变量参数化
1:为Excel参数化
任务->动态属性任务->输入描述信息:(SetParameters)->添加->ExcelFile->DataSource(双击)->源->选择全局变量->变量->FileName->确定
2:为数据库参数化
添加->连接->SQL Server->双击DataSource->源->选择全局变量->ServerName->确定
添加->连接->SQL Server->双击Catalog->源->选择全局变量->DataBaseName->确定
3:全局参数化完成
--E:添加工作流
SQL可以为每一个过程添加工作流,处理所有转换过程中出现的意外
本例子均采用成功时,其它工作流雷同。(如导入失败可以,发Email通知等相关操作)
选择动态属性任务和ExcelFile 用成功时连
--F:数据库中日志处理
DTS过程中的日志,可以用一个日志表记录,详细可以查看导入数据情况
任务->SQL任务->然后用SQLServer 与SQL任务建立一个成功时的工作流
双击SQL任务属性:添件记录SQL语句如:
INSERT
INTO LogTable
(Status)
VALUES (?)
注意:?表示参数化,选择参数,为它选择一个全局变量,参数化。确定,完成
--所有配置完成,生成图如下:
---所有配置做完后,现在就是调用它:
笔者介绍三种调用方式:
A:命令
开始:dtsrunui (有向导,按照向导,为每一个参数赋予值,就可以了)一般用于测试
B:包调用
这个也有相关书籍介绍,笔者略
C:存储过程调用
CREATE PROCEDURE my_proc1 AS
EXEC master.dbo.xp_cmdshell 'dtsrun /S /E /N"水质项目监测数据导入" /A"ServerName":8= /A"FileName":8="D:/SZDATA/ExcelData/AppraiseData.xls" /A"DataSource":8="SZ"'
GO
笔者稍微说明下参数定义:
/S 服务器 /E 信任连接 /N 包名
/ ServerName: 为空 ,8:全局参数类型为字符
/A 表示全局变量
D:利用游标循环调用DTS
--包参数调用的另一种方式:
DECLARE @STCD varchar(10)
DECLARE STCDS_CURSOR CURSOR FOR
OPEN STCDS_CURSOR
FETCH NEXT FROM STCDS_CURSOR
INTO @STCD
WHILE @@FETCH_STATUS = 0
BEGIN
--调用包代码
EXEC('master.dbo.xp_cmdshell ''dtsrun /S /E /N"新建包" /A"STCD":3="'+@STCD+'"''')
FETCH NEXT FROM STCDS_CURSOR
INTO @STCD
END
CLOSE STCDS_CURSOR
DEALLOCATE STCDS_CURSOR
GO
E:.net调用方式:
//说明需要添加 Microsoft.SqlServer.DTSPkg80.Package2Class
/// <summary>
/// 运行DTS(Data Transformation Services )
/// </summary>
/// <returns></returns>
public string runDTS()
{
try
{
string returnValue;
Microsoft.SqlServer.DTSPkg80.Package2Class package = new Microsoft.SqlServer.DTSPkg80.Package2Class();
string fileName = "C://DTStest.dts";
string password = null;
string packageID = null;
string versionID = null;
string name = "DTStest";
object pVerpersistStfOfHost = null;
package.LoadFromStorageFile(fileName,password,packageID,versionID,name,ref pVerpersistStfOfHost);
package.Execute();
package.UnInitialize();
package=null;
returnValue = "success";
return returnValue;
}
catch(Exception ex)
{
throw ex;
}
}
--
作者5种方式均测试通过.