在實際開發中,經常需要將儲存在多個文本文件(如 CSV)中的數據批量導入 SQL Server 資料表。本文詳細介紹如何結合批處理文件與 DTS(Data Transformation Services),從指定目錄自動讀取多個文件並將數據匯入資料庫。
在 C:\MyImport 目錄下建立三個 CSV 文件:
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
EXEC sp_addlogin 'importuser', 'import', 'Bank';
GO
USE Bank;
GO
EXEC sp_adduser 'importuser';
GO
EXEC sp_addrolemember 'db_datareader', 'importuser';
GO
EXEC sp_addrolemember 'db_datawriter', 'importuser';
GO
FileName、ServerName、DatabaseName。Account 資料表的對應欄位(ID、Name、AccountNo、Balance)。InputFile 連線:將 Catalog 設為全域變數 DatabaseName,DataSource 設為 FileName。SQLServer 連線:將 DataSource 設為全域變數 ServerName。INSERT INTO LogTable (Status) VALUES (?),參數 1 綁定全域變數 FileName。撰寫批處理檔(*.bat)遍歷目錄下所有 CSV 文件,依序設定全域變數 FileName 並呼叫 dtsrun 執行套件,即可實現無人值守的多文件匯入。
ServerName、DatabaseName 可在批處理中透過 /A 參數傳入,提高複用性。