菜鸟学堂:
使用dts导入多个文件数据到sql server中
在我们工作中,经常需要将保存在文件中的数据导入到sql serve的表中。有时可能需要同时从相同或不相同的文件目录中导入多个文件的数据到sql server中。这里我们将讨论如何使用批处理文件和dts从一个特定的文件目录中,导入多个文件的数据到sqlserver中。
试验环境
我们先创建整个试验的环境。创建文件目录“c:/myimport”,和三个文件a.csv、b.csv和c.csv,文件内容如下。同时,在sql server中创建一个表用来存放导入的数据。
c:/myimport/a.csv
1, mak, a9411792711, 3400.25
2, claire, a9411452711, 24000.33
3, sam, a5611792711, 1200.34
4, wright, a5611792711, 1200.34
5, richard, g561d792755, 1223.34
6, valarie, b5611792788, 1240.32
c:/myimport/b.csv
11, rubon, 9671792711, 400.14
22, mike, 9418952711, 4000.56
39, hsu, 75611792511, 1230.00
c:/myimport/c.csv
69, lucy, 8411992710, 305.11
45, grace, 3413452713, 246.52
33, saint, 5461795716, 1278.70
create database bank
go
use bank
go
create table account([id] int, name varchar(100),
accountno varchar(100), balance money)
go
create table logtable (id int identity(1,1),
status varchar(500),
importeddate datetime default getdate())
go
use master
go
sp_addlogin 'importuser','import','bank'
go
use bank
go
sp_adduser 'importuser'
go
sp_addrolemember 'db_datareader','importuser'
go
sp_addrolemember 'db_datawriter','importuser'
go
创键dts
1、在dts中创建3个全局变量,filename、servername和databasename。
2、创建text file (source) 和sql server连接,并创建数据转换任务,如下图所示。
3、设置数据转换的对应关系如下图。
4、创建动态属性任务(dynamic tasks):连接inputfile中,设置catalog的值为全局变量databasename,datasource的值为全局变量filename;连接sqlserver中,设置datasource的值为全局变量servername。
5、增加一个“成功时”的工作流在动态属性任务和连接inputfile之间。
6、如下图那样,创建一个执行sql任务,来保存数据导入的记录。
sql为insert into logtable (status) values (?)
点击参数,来设置参数,设置参数1为全局变量filename。
7、增加一个“成功时”的工作流在连接sqlserver和执行sql任务之间。
8、将dts包保存成结构化存储文件。你也可以保存在sql server中,但我们这里只讨论保存成结构化存储文件的方式。
创建批处理文件
如下所示创建批处理文件c:/myimport/import.bat。
rem type: batch file
rem created by: digjim
rem import all csv files to sql server using dts
rem export dir listing to c:/myimport/dirlist.txt
dir c:/myimport/*.csv /b > c:/myimport/dirlist.txt
rem execute dts package for every file name in the dirlist.txt
for /f "tokens=1,2,3" %%i in (c:/myimport/dirlist.txt) do "c:/program files/microsoft sql server/80/tools/binn/dtsrun.exe" -f "c:/myimport/myimportdts1.dts" -u importuser -p import –a "servername"="digjim" -a "filename"="c:/myimport/%%i" -a "databasename"="bank"
rem rename all the files with "old" as suffix
ren c:/myimport/*.csv *.oldcsv
执行批处理文件
当批处理文件被执行以后,他会在c:/myimport目录下产生一个dirlist.txt的文件,这个文件会包含所有c:/myimport下扩展名为csv的文件,这些文件名会和其他必须的参数一气传输给dtsrun.exe。在这个例子里,dirlist.txt的内容如下:
c:/myimport/dirlist.txt
acsv
b.csv
c.csv
注意,在批处理文件中,根据你自己的情况设置servername,filename和databasename参数。
结果
现在你可以去你的数据库看结果,
批处理输入的数据:
1
mak
a9411792711
3400.25
2
claire
a9411452711
24000.33
3
sam
a5611792711
1200.34
4
wright
a5611792711
1200.34
5
richard
g561d792755
1223.34
6
valarie
b5611792788
1240.32
11
rubon
9671792711
400.14
22
mike
9418952711
4000.56
39
hsu
75611792511
1230
69
lucy
8411992710
305.11
45
grace
3413452713
246.52
33
saint
5461795716
1278.7
在logtable中记录的log。
1
c:/myimport/a.csv
2004-4-19 1:16
2
c:/myimport/b.csv
2004-4-19 1:16
3
c:/myimport/c.csv
2004-4-19 1:16
如果你把dts包存储在sql server中,批处理文件就这样写:
rem type: batch file
rem created by: digjim
rem import all csv files to sql server using dts
rem export dir listing to c:/myimport/dirlist.txt
dir c:/myimport/*.csv /b > c:/myimport/dirlist.txt
rem execute dts package for every file name in the dirlist.txt
for /f "tokens=1,2,3" %%i in (c:/myimport/dirlist.txt) do "c:/program files/microsoft sql server/80/tools/binn/dtsrun.exe" –s "sql" –n "myimportdts" -u importuser -p import –a "servername"="digjim" -a "filename"="c:/myimport/%%i" -a "databasename"="bank"
rem rename all the files with "old" as suffix
ren c:/myimport/*.csv *.oldcsv
参考:
使用t-sql导入多个文件数据到sql server中