下面將詳細(xì)討論如何利用BCP導(dǎo)入導(dǎo)出數(shù)據(jù)。
(一)BCP的主要參數(shù)介紹
BCP共有四個動作可以選擇。
(1) 導(dǎo)入。
這個動作使用in命令完成,后面跟需要導(dǎo)入的文件名。
(2) 導(dǎo)出。
這個動作使用out命令完成,后面跟需要導(dǎo)出的文件名。
(3) 使用SQL語句導(dǎo)出。
這個動作使用queryout命令完成,它跟out類似,只是數(shù)據(jù)源不是表或視圖名,而是SQL語句。
(4) 導(dǎo)出格式文件。
這個動作使用format命令完成,后而跟格式文件名。
下面介紹一些常用的選項(xiàng):
-f format_file
format_file表示格式文件名。這個選項(xiàng)依賴于上述的動作,如果使用的是in或out,format_file表示已經(jīng)存在的格式文件,如果使用的是
format則表示是要生成的格式文件。
-x
這個選項(xiàng)要和-f format_file配合使用,以便生成xml格式的格式文件。
-F first_row
指定從被導(dǎo)出表的哪一行導(dǎo)出,或從被導(dǎo)入文件的哪一行導(dǎo)入。
-L last_row
指定被導(dǎo)出表要導(dǎo)到哪一行結(jié)束,或從被導(dǎo)入文件導(dǎo)數(shù)據(jù)時,導(dǎo)到哪一行結(jié)束。
-c
使用char類型做為存儲類型,沒有前綴且以"\t"做為字段分割符,以"\n"做為行分割符。
-w
和-c類似,只是當(dāng)使用Unicode字符集拷貝數(shù)據(jù)時使用,且以nchar做為存儲類型。
-t field_term
指定字符分割符,默認(rèn)是"\t"。
-r row_term
指定行分割符,默認(rèn)是"\n"。
-S server_name[ \instance_name]
指定要連接的SQL Server服務(wù)器的實(shí)例,如果未指定此選項(xiàng),BCP連接本機(jī)的SQL Server默認(rèn)實(shí)例。如果要連接某臺機(jī)器上的默認(rèn)實(shí)例,只需要指定機(jī)器名即可。
-U login_id
指定連接SQL Sever的用戶名。
-P password
指定連接SQL Server的用戶名密碼。
-T
指定BCP使用信任連接登錄SQL Server。如果未指定-T,必須指定-U和-P。
-k
指定空列使用null值插入,而不是這列的默認(rèn)值。
(二). 如何使用BCP導(dǎo)出數(shù)據(jù)
(1) 使用BCP導(dǎo)出整個表或視圖。
BCP AdventureWorks.sales.currency out c:\currency1.txt -c -U"sa" -P"password" --使用密碼連接
或
BCP AdventureWorks.sales.currency out c:\currency1.txt -c -T --使用信任連接
在使用密碼登錄時需要將-U后的用戶名和-P后的密碼加上雙引號。
注:BCP除了可以在控制臺執(zhí)行外,還可以通過調(diào)用SQL Server的一個系統(tǒng)存儲過程xp_cmdshell以SQL語句的方式運(yùn)行BCP。如上述第一條命令可改寫為
EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency out c:\currency1.txt -c -U"sa" -P"password"'
執(zhí)行xp_cmdshell后,返回信息以表的形式輸出。為了可以方便地在SQL中執(zhí)行BCP,下面的命令都使用xp_cmdshell執(zhí)行BCP命令。
(2) 對要導(dǎo)出的表進(jìn)行過濾。
BCP不僅可以接受表名或視圖名做為參數(shù),也可以接受SQL做為參數(shù)。通過SQL語句可以對要導(dǎo)出的表進(jìn)行過濾,然后導(dǎo)出過濾后的記錄。
EXEC master..xp_cmdshell 'BCP "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:\currency2.txt -c -U"sa" -P"password"'
BCP還可以通過簡單地設(shè)置選項(xiàng)對導(dǎo)出的行進(jìn)行限制。
EXEC master..xp_cmdshell 'BCP "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:\currency2.txt -F 10 -L 13 -c -U"sa" -P"password"'
這條命令使用了兩個參數(shù)-F 10和-L 13,表示從SELECT TOP 20 * FROM AdventureWorks.sales.currency所查出來的結(jié)果中取第10條到13條記錄進(jìn)行導(dǎo)出。
(三). 如何使用BCP導(dǎo)出格式文件
BCP不僅可以根據(jù)表、視圖導(dǎo)入導(dǎo)出數(shù)據(jù),還可以配合格式文件對導(dǎo)入導(dǎo)出數(shù)據(jù)進(jìn)行限制。格式文件以純文本文件形式存在,分為一般格式和xml格式。用戶可以手工編寫格式文件,也可以通過BCP命令根據(jù)表、視圖自動生成格式文件。
EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency format nul -f c:\currency_format1.fmt -c -T'
上述命令將currency表的結(jié)構(gòu)生成了一個格式文件currency_format1.fmt
BCP還可以通過-x選項(xiàng)生成xml格式的格式文件。
EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency format nul -f c:\currency_format2.fmt -x -c -T'
xml格式文件所描述的內(nèi)容和普通格式文件所描述的內(nèi)容完全一樣,只是格式不同。
(四). 如何使用BCP導(dǎo)入數(shù)據(jù)
BCP可以通過in命令將上面所導(dǎo)出的currency1.txt和currency2.txt再重新導(dǎo)入到數(shù)據(jù)庫中,由于currency有主鍵,因此我們將復(fù)制一個和currency的結(jié)構(gòu)完全一樣的表。
SELECT TOP 0 * INTO AdventureWorks.sales.currency1 FROM AdventureWorks.sales.currency
將數(shù)據(jù)導(dǎo)入到currency1表中
EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -c -T'
導(dǎo)入數(shù)據(jù)也同樣可以使用-F和-L選項(xiàng)來選擇導(dǎo)入數(shù)據(jù)的記錄行。
EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -c -F 10 -L 13 -T'
在導(dǎo)入數(shù)據(jù)時可以根據(jù)已經(jīng)存在的格式文件將滿足條件的記錄導(dǎo)入到數(shù)據(jù)庫中,不滿足則不導(dǎo)入。如上述的格式文件中的第三個字段的字符長度是24,如果某個文本文件中的相應(yīng)字段的長度超過24,則這條記錄將不被導(dǎo)入到數(shù)據(jù)庫中,其它滿足條件的記錄正常導(dǎo)入。
使用普通的格式文件
EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -F 10 -L 13 -c -f c:\currency_format1.fmt -T'
使用xml格式的格式文件
EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -F 10 -L 13 -c -x -f c:\currency_format2.fmt -T'
總結(jié)
BCP命令是SQL Server提供的一個快捷的數(shù)據(jù)導(dǎo)入導(dǎo)出工具。使用它不需要啟動任何圖形管理工具就能以高效的方式導(dǎo)入導(dǎo)出數(shù)據(jù)。當(dāng)然,它也可以通過 xp_cmdshell在SQL語句中執(zhí)行,通過這種方式可以將其放到客戶端程序中(如delphi、c#等)運(yùn)行,這也是使客戶端程序具有數(shù)據(jù)導(dǎo)入導(dǎo)出功能的方法之一。