sqlserver快速匯入匯出工具

regonly1發表於2014-02-28

由於客戶將sqlserver作為生產資料庫,所以最近半年時間一直在此下面做開發和學習。之前找開發工具也找了很長時間,最後總算找到一個比較喜歡的toad for mssql。
有次,需要將sqlserver的資料移植到oracle版本下,用oracle下的程式進行資料驗證。但是發現,toad for mssql的文字匯出實在太慢,600w的資料居然花了40多分鐘還沒導完,這樣的速度是無法容忍的。
經過大量的資料和查詢後,最後發現bcp這個工具。該工具匯出非常快速,同樣600w+的資料,只花了5分鐘左右的時間,全部匯出,而且符合格式要求。
參考命令如下:
bcp [table_name] out [file_name] -t "\t" -c -S [server_name] -U [username] -P [password]
含義如下:
[table_name]:表示要匯出的表;
out:表示匯出(in則表示匯入);
-t:表示以什麼作為欄位的分隔符。預設為製表符(即\t);
-c:表示以文字方式匯出;
-S:主機名;
-U:sqlserver使用者名稱;
-P:密碼;

更多資訊:
用法: bcp {dbtable | query} {in | out | queryout | format} 資料檔案
[-m 最大錯誤數] [-f 格式化檔案] [-e 錯誤檔案]
[-F 首行] [-L 末行] [-b 批大小]
[-n 本機型別] [-c 字元型別] [-w 寬字元型別]
[-N 將非文字保持為本機型別] [-V 檔案格式版本] [-q 帶引號的識別符號]
[-C 內碼表說明符] [-t 欄位終止符] [-r 行終止符]
[-i 輸入檔案] [-o 輸出檔案] [-a 資料包大小]
[-S 伺服器名稱] [-U 使用者名稱] [-P 密碼]
[-T 可信連線] [-v 版本] [-R 允許使用區域設定]
[-k 保留 Null 值] [-E 保留標識值]
[-h"載入提示"] [-x 生成 xml 格式化檔案]
[-d 資料庫名稱] [-K 應用程式意向]

該工具同樣適合於匯入,引數可以參考以上內容。但是,需要注意的是,bcp的匯入對日期型別會有問題。匯入報錯類似如下:


開始複製...
SQLState = 22005, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]對於造型說明無效的字元值
SQLState = 22005, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]對於造型說明無效的字元值
SQLState = 22005, NativeError = 0
Error = [Microsoft][SQL Server Native Client 11.0]對於造型說明無效的字元值

BCP 複製 in 失敗
出現該問題的原因是bcp在處理日期型別的時候,無法識別類似12-1-2014和1-12-2014這樣的日期資料。似乎是bcp的一個bug,暫時也沒有找到有效的修復補丁。
可以嘗試在sql環境下用如下方式解決:
bulk insert table_name
from 'filename'--如:c:\filename.csv
with
( FIELDTERMINATOR ='\t', -- 分隔符
--ROWTERMINATOR ='\n',
KILOBYTES_PER_BATCH=5000,
firstrow=1
)
該方式匯入的速度極快,130w左右的資料,10s左右即可匯入。非常方便。

有關bulk insert的更多內容可參考官方文件:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-1096912/,如需轉載,請註明出處,否則將追究法律責任。

相關文章