程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> 更多數據庫知識 >> sqlserver bcp(數據導入導出工具)一般用法與命令詳解

sqlserver bcp(數據導入導出工具)一般用法與命令詳解

編輯:更多數據庫知識

bcp是SQL Server中負責導入導出數據的一個命令行工具,它是基於DB-Library的,並且能以並行的方式高效地導入導出大批量的數據。bcp可以將數據庫的表或視圖直接導出,也能通過SELECT FROM語句對表或視圖進行過濾後導出。在導入導出數據時,可以使用默認值或是使用一個格式文件將文件中的數據導入到數據庫或將數據庫中的數據導出到文件中。下面將詳細討論如何利用bcp導入導出數據。

1. bcp的主要參數介紹

bcp共有四個動作可以選擇。
(1) 導入。
這個動作使用in命令完成,後面跟需要導入的文件名。
(2) 導出。
這個動作使用out命令完成,後面跟需要導出的文件名。
(3) 使用SQL語句導出。
這個動作使用queryout命令完成,它跟out類似,只是數據源不是表或視圖名,而是SQL語句。
(4) 導出格式文件。
這個動作使用format命令完成,後而跟格式文件名。
下面介紹一些常用的選項:
-f format_file
format_file表示格式文件名。這個選項依賴於上述的動作,如果使用的是in或out,format_file表示已經存在的格式文件,如果使用的是format則表示是要生成的格式文件。
-x
這個選項要和-f format_file配合使用,以便生成xml格式的格式文件。
-F first_row
指定從被導出表的哪一行導出,或從被導入文件的哪一行導入。
-L last_row
指定被導出表要導到哪一行結束,或從被導入文件導數據時,導到哪一行結束。
-c
使用char類型做為存儲類型,沒有前綴且以"\t"做為字段分割符,以"\n"做為行分割符。
-w
和-c類似,只是當使用Unicode字符集拷貝數據時使用,且以nchar做為存儲類型。
-t field_term
指定字符分割符,默認是"\t"。
-r row_term
指定行分割符,默認是"\n"。
-S server_name[ \instance_name]
指定要連接的SQL Server服務器的實例,如果未指定此選項,bcp連接本機的SQL Server默認實例。如果要連接某台機器上的默認實例,只需要指定機器名即可。
-U login_id
指定連接SQL Sever的用戶名。
-P password
指定連接SQL Server的用戶名密碼。
-T
指定bcp使用信任連接登錄SQL Server。如果未指定-T,必須指定-U和-P。
-k
指定空列使用null值插入,而不是這列的默認值。

2. 如何使用bcp導出數據

(1) 使用bcp導出整個表或視圖。
bcp AdventureWorks.sales.currency out c:\currency1.txt -c -U"sa" -P"password" --使用密碼連接或bcp AdventureWorks.sales.currency out c:\currency1.txt -c -T --使用信任連接
下面是上述命令執行後的輸出結果
Starting copy...
105 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 10 Average : (10500.00 rows per sec.)
下面是currency1.txt的部分內容
AED Emirati Dirham 1998-06-01 00:00:00.000
AFA Afghani 1998-06-01 00:00:00.000
... ... ...
... ... ...
ZWD Zimbabwe Dollar 1998-06-01 00:00:00.000
在使用密碼登錄時需要將-U後的用戶名和-P後的密碼加上雙引號。
注:bcp除了可以在控制台執行外,還可以通過調用SQL Server的一個系統存儲過程xp_cmdshell以SQL語句的方式運行bcp。如上述第一條命令可改寫為
EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency out c:\currency1.txt -c -U"sa" -P"password"'
執行xp_cmdshell後,返回信息以表的形式輸出。為了可以方便地在SQL中執行bcp,下面的命令都使用xp_cmdshell執行bcp命令。
(2) 對要導出的表進行過濾。
bcp不僅可以接受表名或視圖名做為參數,也可以接受SQL做為參數。通過SQL語句可以對要導出的表進行過濾,然後導出過濾後的記錄。
EXEC master..xp_cmdshell 'bcp "SELECT TOP 20 * FROM AdventureWorks.sales.currency" queryout c:\currency2.txt -c -U"sa" -P"password"'
bcp還可以通過簡單地設置選項對導出的行進行限制。
這條命令使用了兩個參數-F 10和-L 13,表示從SE
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"'
LECT TOP 20 * FROM AdventureWorks.sales.currency所查出來的結果中取第10條到13條記錄進行導出。

3. 如何使用bcp導出格式文件

bcp不僅可以根據表、視圖導入導出數據,還可以配合格式文件對導入導出數據進行限制。格式文件以純文本文件形式存在,分為一般格式和xml格式。用戶可以手工編寫格式文件,也可以通過bcp命令根據表、視圖自動生成格式文件。
EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency format nul -f c:\currency_format1.fmt -c -T'
上述命令將currency表的結構生成了一個格式文件currency_format1.fmt,下面是這個格式文件的內容。
9.0
3
1 SQLCHAR 0 6 "\t" 1 CurrencyCode SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 100 "\t" 2 Name SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 24 "\r\n" 3 ModifiedDate
這個格式文件記錄了這個表的字段(共3個字段)類型、長度、字符和行分割符和字段名等信息。
bcp還可以通過-x選項生成xml格式的格式文件。
EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency format nul -f c:\currency_format2.fmt -x -c -T'
xml格式文件所描述的內容和普通格式文件所描述的內容完全一樣,只是格式不同。

4. 如何使用bcp導入數據

bcp可以通過in命令將上面所導出的currency1.txt和currency2.txt再重新導入到數據庫中,由於currency有主鍵,因此我們將復制一個和currency的結構完全一樣的表。
SELECT TOP 0 * INTO AdventureWorks.sales.currency1 FROM AdventureWorks.sales.currency
將數據導入到currency1表中
EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency1 in c:\currency1.txt -c -T'
導入數據也同樣可以使用-F和-L選項來選擇導入數據的記錄行。
EXEC master..xp_cmdshell 'bcp AdventureWorks.sales.currency1 in c:\currency1.txt -c -F 10 -L 13 -T'
在導入數據時可以根據已經存在的格式文件將滿足條件的記錄導入到數據庫中,不滿足則不導入。如上述的格式文件中的第三個字段的字符長度是24,如果某個文本文件中的相應字段的長度超過24,則這條記錄將不被導入到數據庫中,其它滿足條件的記錄正常導入。
使用普通的格式文件
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'

總結

bcp命令是SQL Server提供的一個快捷的數據導入導出工具。使用它不需要啟動任何圖形管理工具就能以高效的方式導入導出數據。當然,它也可以通過xp_cmdshell在SQL語句中執行,通過這種方式可以將其放到客戶端程序中(如delphi、c#等)運行,這也是使客戶端程序具有數據導入導出功能的方法之一。

bcp命令詳解(sybase)

bcp 實用工具在 Microsoft SQL Server 2000 實例和數據文件之間以用戶指定的格式復制數據。
語法
bcp {[[database_name.][owner].]{table_name | view_name} | "query"}
{in | out | queryout | format} data_file
[-m max_errors] [-f format_file] [-e err_file]
[-F first_row] [-L last_row] [-b batch_size]
[-n] [-c] [-w] [-N] [-V (60 | 65 | 70)] [-6]
[-q] [-C code_page] [-t field_term] [-r row_term]
[-i input_file] [-o output_file] [-a packet_size]
[-S server_name[\instance_name]] [-U login_id] [-P password]
[-T] [-v] [-R] [-k] [-E] [-h "hint [,...n]"]

參數
database_name

指定的表或視圖所在數據庫的名稱。如果未指定,則為用戶默認數據庫。

owner

表或視圖所有者的名稱。如果執行大容量復制操作的用戶擁有指定的表或視圖,則 owner 是可選的。如果沒有指定 owner 並且執行大容量復制操作的用戶不擁有指定的表或視圖,則 Microsoft? SQL Server? 2000 將返回錯誤信息並取消大容量復制操作。

table_name

是將數據復制到 SQL Server 時 (in) 的目的表名,以及從 SQL Server 復制數據時 (out) 的源表名。

view_name

是將數據復制到 SQL Server 時 (in) 的目的視圖名,以及從 SQL Server 復制數據時 (out) 的源視圖名。只有其中所有列都引用同一個表的視圖才能用作目的視圖。有關將數據復制到視圖的限制的更多信息,請參見 INSERT。

Query

是返回一個結果集的 Transact-SQL 查詢。如果查詢返回多個結果集,例如指定 COMPUTE 子句的 SELECT 語句,只有第一個結果集將復制到數據文件,隨後的結果集被忽略。使用雙引號引起查詢語句,使用單引號引起查詢語句中嵌入的任何內容。在從查詢中大容量復制數據時,還必須指定 queryout。

in | out | queryout | format

指定大容量復制的方向。in 是從文件復制到數據庫表或視圖,out 是指從數據庫表或視圖復制到文件。只有從查詢中大容量復制數據時,才必須指定 queryout。根據指定的選項(-n、-c、-w、-6 或 -N)以及表或視圖分隔符,format 將創建一個格式文件。如果使用 format,則還必須指定 -f 選項。



說明 Microsoft SQL Server 6.5 中的 bcp 實用工具不支持大容量復制到包含 sql_variant 或 bigint 數據類型的表。


data_file

大容量復制表或視圖到磁盤(或者從磁盤復制)時所用數據文件的完整路徑。當將數據大容量復制到 SQL Server 時,此數據文件包含將復制到指定表或視圖的數據。當從 SQL Server 大容量復制數據時,該數據文件包含從表或視圖復制的數據。路徑可以有 1 到 255 個字符。

-m max_errors

指定在大容量復制操作取消之前可能產生的錯誤的最大數目。bcp 無法復制的每一行都將被忽略並計為一個錯誤。如果沒有包括該選項,則默認為 10。

-f format_file

指定格式文件的完整路徑,該格式文件包含以前在同一個表或視圖上使用 bcp 時的存儲響應。當使用由 format 選項所創建的格式文件大容量復制入或復制出數據時,使用此選項。格式文件的創建是可選的。在提示幾個格式問題之後,bcp 將提示是否在格式文件中保存回答。默認文件名為 Bcp.fmt。大容量復制數據時,bcp 可引用一個格式文件,因此不必重新交互輸入以前的回答。如果未使用此選項,也沒有指定 –n、-c、-w、-6 或 -N,則 bcp 將提示輸入格式信息。

-e err_file

指定錯誤文件的完整路徑,此錯誤文件用於存儲 bcp 無法從文件傳輸到數據庫的所有行。來自 bcp 的錯誤信息將發送到用戶工作站。如果未使用此選項,則不創建錯誤文件。

-F first_row

指定要大容量復制的第一行的序數。默認值是 1,表示在指定數據文件的第一行。

-L last_row

指定要大容量復制的最後一行的序數。默認值是 0,表示指定數據文件中的最後一行。

-b batch_size

指定所復制的每批數據中的行數。每個批處理作為一個事務復制至服務器。SQL Server 提交或回滾(在失敗時)每個批處理的事務。默認情況下,指定的數據文件中的所有數據都作為一批復制。請不要與 -h "ROWS_PER_BATCH = bb" 選項一起使用。

-n

使用數據的本機(數據庫)數據類型執行大容量復制操作。此選項不提示輸入每一字段,它將使用本機值。

-c

使用字符數據類型執行大容量復制操作。此選項不提示輸入每一字段;它使用 char 作為存儲類型,不帶前綴,\t(制表符)作為字段分隔符,\n(換行符)作為行終止符。

-w

使用 Unicode 字符執行大容量復制操作。此選項不提示輸入每一字段;它使用 nchar 作為存儲類型,不帶前綴,\t(制表符)作為字段分隔符,\n(換行符)作為行終止符。不能在 SQL Server 6.5 版或更早版本中使用。

-N

對非字符數據使用數據的本機(數據庫)數據類型和對字符數據使用 Unicode 字符類型執行大容量復制操作。這是可替代 -w 選項的性能更高的選項,其目的是使用數據文件將數據從一個 SQL Server 傳輸到另一個 SQL Server 中。它不提示輸入每一字段。在需要傳輸包含 ANSI 擴展字符的數據以及想利用本機模式的性能時,可以使用這一選項。不能在 SQL Server 6.5 版或更早版本中使用 -N 選項。

-V (60 | 65 | 70)

使用 SQL Server 早期版本中的數據類型執行大容量復制操作。此選項與字符 (-c) 或本機 (-n) 格式一起使用。此選項並不提示輸入每一字段,它使用默認值。例如,若要將 SQL Server 6.5 中的 bcp 實用工具所支持(但 ODBC 不再支持)的日期格式大容量復制到 SQL Server 2000,可使用 -V 65 參數。



重要 將數據從 SQL Server 大容量復制到數據文件時,即使指定了 –V,bcp 實用工具也不會為任何 datetime 或 smalldatetime 數據生成 SQL Server 6.0 或 SQL Server 6.5 的日期格式。日期將始終以 ODBC 格式寫入。另外,由於 SQL Server 6.5 版或更早版本不支持可為空的 bit 數據,因此 bit 列中的空值寫為值 0。


-6

使用 SQL Server 6.0 或 SQL Server 6.5 數據類型執行大容量復制操作。僅為保持向後兼容性。改為使用 –V 選項。

-q

在 bcp 實用工具和 SQL Server 實例的連接中執行 SET QUOTED_IDENTIFIERS ON 語句。使用該選項指定包含空格或引號的數據庫、所有者、表或視圖的名稱。將由三部分組成的整個表名或視圖名引在雙引號 (" ") 中。

-C code_page

僅為保持向後兼容性。作為代替,請在格式文件或交互式 bcp 中為每一列指定一個排序規則名。

指定數據文件中的數據代碼頁。只有當數據中包含字符值大於 127 或小於 32 的 char、varchar 或 text 列時,code_page 才有用。

代碼頁值 描述
ACP ANSI/Microsoft Windows? (ISO 1252)。
OEM 客戶程序使用的默認代碼頁。如果未指定 -C,則這是 bcp 使用的默認代碼頁。
RAW 不發生從一個代碼頁到另一個代碼頁的轉換。因為不發生轉換,所以這是最快的選項。
<值> 特定的代碼頁號碼,例如 850。


-t field_term

指定字段終止符。默認的字段終止符是 \t(制表符)。使用此參數替代默認字段終止符。

-r row_term

指定行終止符。默認的行終止符是 \n(換行符)。使用此參數替代默認行終止符。

-i input_file

指定響應文件的名稱,使用交互模式(未指定 –n、-c、-w、-6 或 -N)執行大容量復制時,響應文件包含對每一字段命令提示問題的響應。

-o output_file

指定接收 bcp 輸出(從命令提示重定向)的文件的名稱。

-a packet_size

指定發送到和發送自服務器的每個網絡數據包的字節數。可以使用 SQL Server 企業管理器(或 sp_configure 系統存儲過程)設置服務器配置選項。但是,使用此選項可以單個地替代服務器配置選項。packet_size 可以設置為 4096 到 65535 字節,默認值為 4096。

數據包大小的增加能夠提高大容量復制操作的性能。如果要求一個較大的數據包而得不到,則使用默認設置。bcp 生成的性能統計顯示出所使用數據包的大小。

-S server_name[\instance_name]

指定要連接到的 SQL Server 實例。指定 server_name 以連接該服務器上的 SQL Server 默認實例。指定 server_name\instance_name 以連接到該服務器上的 SQL Server 2000 命名實例。如果未指定服務器,則 bcp 連接到本地計算機上的 SQL Server 默認實例。從網絡上的遠程計算機執行 bcp 時,要求此選項。

-U login_id

指定用於連接到 SQL Server 的登錄 ID。

-P password

指定登錄 ID 的密碼。如果未使用此選項,則 bcp 將提示輸入密碼。如果不帶密碼將此選項用於命令提示行末尾,則 bcp 將使用默認密碼 (NULL)。

-T

指定 bcp 使用網絡用戶的安全憑據,通過信任連接連接到 SQL Server。不需要 login_id 和 password。

-v

報告 bcp 實用工具的版本號和版權。

-R

指定使用為客戶端計算機的區域設置定義的區域格式,將貨幣、日期和時間數據大容量復制到 SQL Server 中。默認情況下,將會忽略區域設置。

-k

指定在大容量復制操作中空列應保留一個空值,而不是對插入的列賦予默認值。

bcp 的一般用法

用法: 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 保留空值] [-E 保留標識值]
[-h"加載提示"] [-x 生成xml 格式化文件]
導入csv格式文件
Exec master..xp_cmdshell 'bcp "SSIS.dbo.tb2" in "E:\export.csv" -c -t"," -r"\n" -T'
導出成csv
Exec master..xp_cmdshell 'bcp "SSIS.dbo.tb2" out "E:\test.csv" -c -t"," -r"\n" -T'
將特定查詢導出成默認格式
默認以制表符間隔,"\n"換行
Exec master..xp_cmdshell 'bcp "select carbrand,longitude from ssis.dbo.tb2" queryout "E:\test2.txt" -c -T'
其他情況參考:http://msdn.microsoft.com/zh-cn/library/ms162802.aspx
啟用xp_cmdshell
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved