引言
導入數據到SQL Server 是常見的需求,特別是定期導入這種需求。
對於定期導入主要有以下幾種方式可選擇:
- Bulk Insert
- Bcp Utility
- OpenRowSet
- 寫程序導入(使用poi, npoi, ExcelDataReader 等各種組件導入導出,后面不做描述)
接下來我們詳細分析下他們的特點和要求
Bulk Insert
執行環境:SQL Server,屬於Transact SQL, 可在查詢窗口和存儲過程中運行。
支持版本:從SQL Server2008開始支持
語法詳見:MSDN Bulk Insert
功能特點:支持txt, csv等有分隔符分割數據的文件,因CSV不支持多個sheet, 所以Bulk Insert只支持導入單個文件。
使用舉例:
在SP中使用,數據文件和分隔符是可變的,所以使用下面的方式:
強調幾個比較重要的配置:
- FilePath:對於@p_filePath,如果是遠程磁盤,需使用UNC(Universal Naming Convention )格式, \\Systemname或主機IP\ShareName\Path\FileName
- DataFileType:數據編碼{ 'char' | 'native' | 'widechar' | 'widenative' },widechar和widenative支持unicode
在Windows 批處理文件中用 osql 調用使用Bulk Insert 的SP,當然你也可以直接在在Sql Server Job 中調用。
Bcp Utility
執行環境:window 命令窗口或在batch文件中執行,有batch文件就可以用window計划或Control-M等工具調用。
語法詳見:BCP Utility
功能特點:可以在數據文件與SQL Server之間導入、導出數據,也可以導出格式文件。
bcp [database_name.] schema.{table_name | view_name | "query" {in data_file | out data_file | queryout data_file | format nul}
- in 導入數據到table
- out 導出table 數據到文件
- queryout 導出查詢結果到文件
- format nul 導出格式文件
使用舉例:
使用時可能碰到各種報錯,例如數據庫連接不成功、文件路徑不正確、表訪問修改權限不夠、格式文件不對或數據文件有問題等等
我在使用時采用以下思路:
- 先用format nul 根據表導出格式文件
- 使用out 導出數據文件
- 在導出的數據文件基礎上修改,制作新的數據文件
- 使用in 和導出的格式文件導入數據
下面的命令使用“,”進行分割,可以使用csv文件,詳細命令如下:
- -S:server name
- -T:SQL Server 信任模式,若不指定,則需用-U、-P指定數據庫用戶名,密碼
- -t :字段分隔符,默認是tab字符,-t,表示用逗號分隔
- -c:表數據是字符型,以tab字符為字段分隔符,以\r\n為行分隔符
bcp instance.dbo.table format nul -S servername -f FormatFile.fmt -T -t, -c bcp instance.dbo.table out c:\dataFile.csv -S servername -T -t, -c
bcp instance.dbo.table in dataFilePath -f formatFilePath -S serverName -T
對於格式文件,說明如下,圖片來至MSDN
OpenRowSet
執行環境:SQL Server,屬於Transact SQL, 可在查詢窗口和存儲過程中運行。
支持版本:從SQL Server2008開始支持
語法詳見:MSDN Bulk Insert
功能特點:支持txt, csv等有分隔符分割數據的文件、excel、代替dblink從其他數據庫(oracle 等)查詢數據。
Provider String:
- Jet引擎 :Microsoft.Jet.OLEDB.4.0
- Jet 是 Joint Engine Technology
- "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=MyUserID;Password=MyPassword;"
- ODBC:MSDASQL
- "Provider=MSDASQL;DSN=dsnName;UID=MyUserID;PWD=MyPassword;"
- Oracel:MSDAORA
- "Provider=MSDAORA;Data Source=serverName;User ID=MyUserID; Password=MyPassword;"
更多請見MSDN參考
使用舉例:
下圖面是從excel 2007中讀取數據的例子,從指定的work sheet 中讀取數據: