使用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<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
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中 |