語法
bcp {[[database_name.][owner].]{table_name | view_name} | "query"}
{in | out | queryout | format} data_file
[-mmax_errors] [-fformat_file] [-x] [-eerr_file]
[-Ffirst_row] [-Llast_row] [-bbatch_size]
[-n] [-c] [-w] [-N] [-V (60 | 65 | 70 | 80)] [-6]
[-q] [-C { ACP | OEM | RAW | code_page } ] [-tfield_term]
[-rrow_term] [-iinput_file] [-ooutput_file] [-apacket_size]
[-Sserver_name[\instance_name]] [-Ulogin_id] [-Ppassword]
[-T] [-v] [-R] [-k] [-E] [-h"hint [,...n]"]
參數含義
database_name
指定的表或視圖所在資料庫的名稱。如果不指定,則使用用戶的默認資料庫。
owner
表或視圖所有者的名稱。如果執行該操作的用戶擁有指定的表或視圖,則 owner 是可選的。如果未指定 owner,並且執行該操作的用戶沒有指定的表或視圖,則 SQL Server 2005 將返回錯誤訊息,同時取消操作。
table_name
將數據導入 SQL Server (in) 時的目標表名稱,以及將數據從 SQL Server (out) 導出時的源表名稱。
view_name
將數據複製到 SQL Server (in) 時的目標視圖名稱,以及複製 SQL Server (out) 中的數據時的源視圖名稱。只有其中所有列都引用同一個表的視圖才能用作目標視圖。有關將數據複製到視圖的限制的詳細信息,請參閱 INSERT (Transact-SQL)。
query
一個返回結果集的 Transact-SQL 查詢。如果該查詢返回多個結果集(如包含 COMPUTE 子句的 SELECT 語句),則只將第一個結果集複製到數據檔案,而忽略其它結果集。請將查詢放在英文雙引號中,將查詢中嵌入的任何內容放在英文單引號中。從查詢大容量複製數據時,還必須指定 queryout。
in | , out| , queryout | , format
指定大容量複製的方向,具體如下:
in 從檔案複製到資料庫表或視圖。
注意:
SQL Server 6.5 的 bcp 實用工具不支持向包含 sql_variant 或 bigint數據類型的表進行大容量複製。
out 從資料庫表或視圖複製到檔案。
queryout 從查詢中複製,僅當從查詢大容量複製數據時才必須指定此選項。
format 根據指定的選項(-n、-c、-w、-6 或 -N)以及表或視圖的分隔設定創建格式檔案。大容量複製數據時,
bcp 命令可以引用一個格式檔案,從而避免以互動方式重複輸入格式信息。format 選項要求指定 -f 選項;創建一個 XML 格式檔案時還需要指定 -x 選項。有關詳細信息,請參閱創建格式化檔案。
data_file
數據檔案的完整路徑。將數據大容量導入 SQL Server 時,數據檔案將包含要複製到指定表或視圖的數據。從 SQL Server 大容量導出複製數據時,數據檔案將包含從表或視圖複製的數據。路徑可以有 1 到 255 個字元。數據檔案最多可包含 2,147,483,647 行。
重要事項:
對於 format 選項,必須指定 nul 作為 data_file (format nul) 的值。
-m max_errors
指定 bcp 操作允許的語法錯誤最大數目。語法錯誤是指將數據轉換為目標數據類型時的錯誤。max_errors 總數不包括只能在伺服器中檢測到的錯誤,如違反約束。
無法由 bcp 複製的每個行都將被忽略,並計為一個錯誤。如果不指定此選項,則默認為 10。
注意:
-m 選項也不用於轉換 money 或 bigint 數據類型。
-f format_file
指定一個格式檔案的完整路徑。該選項的含義取決於使用它的環境,具體如下:
如果 -f 與 format 選項一起使用,則將為指定的表或視圖創建指定的 format_file。若要創建 XML 格式檔案,請同時指定 -x 選項。
如果與 in 或 out 一起使用,則應為 -f 指定一個現有的格式檔案。
注意:
與 in 或 out 選項一起使用時,格式檔案是可選的。如果沒有 -f 選項,則在未指定 -n、-c、-w、-6 或 -N 時,該命令將提示輸入格式信息,並允許用戶將回應保存在格式檔案(默認名稱為 Bcp.fmt)中。
-x
與 format 和 -f format_file 選項一起使用,可以生成基於 XML 的格式化檔案,而不是默認的非 XML 格式化檔案。在導入或導出數據時,-x 不起作用。如果不與 format 和 -f format_file 一起使用,則將生成錯誤。
-e err_file
指定錯誤檔案的完整路徑,此檔案用於存儲 bcp 無法從檔案傳輸到資料庫的所有行。bcp 命令產生的錯誤訊息將被傳送到用戶的工作站。如果不使用此選項,則不會創建錯誤檔案。
-F first_row
指定要從表中導出或從數據檔案導入的第一行的編號。此參數應大於 (>) 0,小於 (<) 或等於 (=) 總行數。如果不指定此參數,則默認為檔案的第一行。
-L last_row
指定要從表中導出或從數據檔案導入的最後一行的編號。此參數應大於 (>) 0,小於 (<) 或等於 (=) 最後一行的編號。如果不指定該參數,則默認為檔案的最後一行。
-b batch_size
指定每批導入數據的行數。每批均作為一個單獨的事務進行導入並記錄,在提交之前會導入整批。默認情況下,數據檔案中的所有行均作為一批導入。若要在多批之間分布行,請指定小於數據檔案中行數的 batch_size。如果任何批的事務失敗,則只回滾當前批中的插入。已經由已提交事務導入的批不會受到將來失敗的影響。
請不要將該選項與 -h"ROWS_PER_BATCH = bb" 選項一起使用。
-n
使用數據的本機(資料庫)數據類型執行大容量複製操作。此選項不提示輸入每個欄位,它將使用本機值。
-c
使用字元數據類型執行該操作。此選項不提示輸入每個欄位;它使用 char 作為存儲類型,不帶前綴;使用 \t(制表符)作為欄位分隔設定,使用 \n(換行符)作為行終止符。
-w
使用 Unicode 字元執行大容量複製操作。此選項不提示輸入每個欄位;它使用 nchar 作為存儲類型,不帶前綴;使用 \t(制表符)作為欄位分隔設定,使用 \n(換行符)作為行終止符。該選項不能在 SQL Server 6.5 或更低版本中使用。
-N
執行大容量複製操作時,對非字元數據使用本機(資料庫)數據類型數據,對字元數據使用 Unicode 字元。此選項是 -w 選項的一個替代選項,並具有更高的性能。該選項主要用於使用數據檔案,將數據從一個 SQL Server 實例傳送到另一個實例。該選項不提示輸入每個欄位。如果要傳送包含 ANSI 擴展字元的數據,並希望利用本地模式的性能優勢,則可使用此選項。-N 不能在 SQL Server 6.5 或更低版本中使用。
-V ( 60| 65| 70| 80)
使用 SQL Server 早期版本中的數據類型執行大容量複製操作。此選項並不提示輸入每個欄位,它將使用默認值。例如,若要將隨 SQL Server 6.5 提供的 bcp 實用工具支持(但 ODBC 不再支持)的日期格式大容量複製到 SQL Server 2005,可使用 -V 65 參數。
重要事項:
如果將大量數據從 SQL Server 導出到數據檔案,那么即使指定了 -V,bcp 實用工具也不會為任何 datetime 或 smalldatetime 數據生成SQL Server 6.0 或 SQL Server 6.5 日期格式。日期將始終以 ODBC 格式寫入。另外,由於 SQL Server 6.5 或更低版本不支持可為空的 bit 數據,因此位列中的空值將寫為值 0。
-6
使用 SQL Server 6.0 或 SQL Server 6.5 數據類型執行大容量複製操作。支持此選項僅為與較早版本兼容。對於 SQL Server 7 及更高版本,請使用 -V 選項。
-q
在連線 bcp 實用工具和 SQL Server 實例時,執行 SET QUOTED_IDENTIFIERS ON 語句。使用此選項可以指定包含空格或單引號的資料庫、所有者、表或視圖的名稱。將由三部分組成的整個表名或視圖名用英文雙引號 ("") 括起來。
若要指定包含空格或單引號的資料庫名稱,必須使用 -q 選項。
有關詳細信息,請參閱本主題後面的“備註”。
-C { ACP | OEM | RAW | code_page }
用於兼容 SQL Server 的早期版本。對於 SQL Server 7.0 及更高版本,Microsoft 建議在格式檔案中為每個列指定一個排序規則名稱。
指定數據檔案中數據的代碼頁。僅當數據包含字元值大於 127 或小於 32 的 char、varchar 或 text 列時,code_page 才適用。
代碼頁值 說明
ACP
ANSI/Microsoft Windows (ISO 1252)。
OEM
客戶端使用的默認代碼頁。未指定 -C 選項時使用的默認代碼頁。
RAW
不進行代碼頁間的轉換。因為不進行轉換,所以這是最快的選項。
code_page
特定的代碼頁編號,例如 850。
-t field_term
指定欄位終止符。默認值為 \t(制表符)。使用此參數可以替代默認欄位終止符。
-r row_term
指定行終止符。默認值為 \n(換行符)。使用此參數可替代默認行終止符。
-i input_file
指定回響檔案的名稱,其中包含在互動模式(未指定 -n、-c、-w、-6 或 -N)下執行大容量複製時,對該命令要求輸入每個數據欄位的提示信息作出的回響。
-o output_file
指定檔案名稱稱,該檔案用於接收從命令提示符重定向來的輸出。
-a packet_size
指定伺服器發出或接收的每個網路數據包的位元組數。可以使用 SQL Server Management Studio(或 sp_configure 系統存儲過程)來設定伺服器配置選項。但是,可以使用該選項逐個替代伺服器配置選項。packet_size 的取值範圍為 4096 到 65535 位元組,默認為 4096 位元組。
增大數據包可以提高大容量複製操作的性能。如果無法得到請求的較大數據包,則使用默認值。bcp 實用工具生成的性能統計信息可以顯示所用數據包的大小。
-S server_name[ \instance_name]
指定要連線的 SQL Server 的實例。如果不指定伺服器,則 bcp 實用工具將連線到本地計算機上的默認 SQL Server 實例。如果從網路或本地命名實例上的遠程計算機運行 bcp ,則必須使用此選項。若要連線到伺服器的 SQL Server 默認實例,請僅指定 server_name。若要連線到 SQL Server 2005 的命名實例,請指定 server_name\instance_name。
-U login_id
指定用於連線 SQL Server 的登錄 ID。
安全性 注意:
如果 bcp 實用工具使用集成安全性的可信連線與 SQL Server 進行連線,則使用 -T 選項(可信連線),而不要使用 user name 和 password 組合。
-P password
指定登錄 ID 的密碼。如果不使用此選項,bcp 命令將提示輸入密碼。如果在命令提示符的末尾使用此選項,但不提供密碼,則 bcp 將使用默認密碼 (NULL)。
安全性 注意:
不要使用空密碼。請使用不易破解的密碼。
若要禁止密碼,請不要同時使用 -U 和 -P 選項。而應在指定 bcp 以及 -U 選項和其他開關(不指定 -P)之後,按 Enter 鍵,這時命令會提示輸入密碼。這種方法可以確保密碼在輸入時被禁止。
-T
指定 bcp 實用工具通過使用集成安全性的受信任連線連線到 SQL Server。不需要網路用戶的安全憑據、login_id 和 password。如果不指定 –T,則需要指定 –U 和 –P 才能成功登錄。
-v
報告 bcp 實用工具的版本號和著作權。
-R
指定使用客戶端計算機區域設定中定義的區域格式,將貨幣、日期和時間數據大容量複製到 SQL Server 中。默認情況下,將忽略區域設定。
-k
指定在操作過程中空列應該保留空值,而不是所插入列的任何默認值。
-E
指定導入的數據檔案中的標識值用於標識列。如果不指定 -E,則將忽略被導入的數據檔案中此列的標識值,而且 SQL Server 2005 將根據創建表期間指定的種子值和增量值自動分配唯一值。
假如數據檔案不包含表或視圖中的標識列的值,則可在格式檔案指定,在導入數據時忽略表或視圖中的標識列;SQL Server 2005 將自動為該列分配唯一值。有關詳細信息,請參閱 DBCC CHECKIDENT (Transact-SQL)。
-E 選項有一個特殊的許可權要求。有關詳細信息,請參閱本主題後面的“備註”。
-h " hint[ ,... n] "
指定向表或視圖中大容量導入數據時所用的提示。向 SQL Server 6.x 或更低版本大容量複製數據時,不能使用此選項。
ORDER(column [ASC | DESC] [,...n])
數據檔案中的數據排序次序。如果根據表中的聚集索引對要載入的數據排序,則可提高大容量複製的性能。如果數據檔案按不同次序排序,或者該表沒有聚集索引,則將忽略 ORDER 提示。提供的列名必須是目標表中的有效列。默認情況下,bcp 假設數據檔案沒有排序。
ROWS_PER_BATCH = bb
每批中數據的行數(即 bb)。在未指定 -b 時使用,這將導致整個數據檔案被作為單個事務傳送到伺服器。伺服器根據 bb 值最佳化大容量載入。默認情況下,ROWS_PER_BATCH 未知。
KILOBYTES_PER_BATCH = cc
每批以千位元組計的數據的近似值(即 cc)。默認情況下,KILOBYTES_PER_BATCH 未知。
TABLOCK
指定在大容量載入操作期間獲取大容量更新表級別的鎖;否則,獲取行級別的鎖。由於在大容量複製操作期間擁有鎖可以減少表中的鎖爭奪,所以此提示可顯著提高性能。如果表沒有索引並且指定了 TABLOCK,則該表可以同時被多個客戶端裝載。默認情況下,鎖定行為由表選項 table lock on bulk load 確定。
CHECK_CONSTRAINTS
指定在大容量導入操作期間,必須檢查所有對目標表或視圖的約束。如果沒有 CHECK_CONSTRAINTS 提示,則忽略所有 CHECK 約束;操作完成後,對表的約束將被標記為不可信。
注意:
始終強制使用 UNIQUE、PRIMARY KEY、FOREIGN KEY 或 NOT NULL 約束。
在某些時候,需要檢查整個表的約束。如果在大容量導入操作之前表為非空狀態,則重新驗證約束的開銷可能超過將 CHECK 約束套用於增量數據的開銷。因此,Microsoft 建議您在正常情況下,在進行增量式大容量導入時,啟用約束檢查。
當輸入數據包含違反約束的行時,您可能希望禁用約束(默認行為)。如果禁用 CHECK 約束,您可以導入數據,然後使用 Transact-SQL 語句刪除無效數據。
注意:
在 SQL Server 2005 中,bcp 會強制執行新的數據驗證和數據檢查,這將導致對數據檔案中的無效數據執行現有腳本時,可能會失敗。
注意:
-mmax_errors 開關不適用於約束檢查。
FIRE_TRIGGERS
與 in 參數一同指定,對目標表中定義的任何插入觸發器都將在大容量複製操作期間運行。如果不指定 FIRE_TRIGGERS,將不運行任何插入觸發器。對於 out、queryout 和 format 參數,將忽略 FIRE_TRIGGERS。
注意:
每個批的觸發器只運行一次(而不是每個行一次)。
示例
將表行複製到數據檔案(使用可信連線)
下面的示例闡釋了 AdventureWorks.Sales.Currency 表中的 out 選項。此示例創建一個名為 Currency.dat 的數據檔案,並使用字元格式將表數據複製到該檔案中。此示例假定您使用 Windows身份驗證,並且與運行 bcp 命令所針對的伺服器實例之間具有受信任連線。
在命令提示符處輸入以下命令:
bcp AdventureWorks.Sales.Currency out Currency.dat -T -c
將表行複製到數據檔案(使用混合模式身份驗證)
下面的示例闡釋了 AdventureWorks.Sales.Currency 表中的 out 選項。此示例創建一個名為 Currency.dat 的數據檔案,並使用字元格式將表數據複製到該檔案中。
以上示例假定您使用的是混合模式身份驗證,您必須使用 -U 開關來指定登錄 ID。此外,除非您連線的是本地計算中 SQL Server 上的默認實例,否則要使用 -S 開關來指定系統名稱和實例名稱(實例名稱可選)。
bcp AdventureWorks.Sales.Currency out Currency.dat -c -U<login_id> -S<server_name\instance_name>
系統將提示您輸入密碼。
將數據從檔案複製到表。
以下示例使用上例創建的檔案 (Currency.dat) 來闡釋 in 選項。但是,此示例將首先創建一個 AdventureWorks Sales.Currency 表的空副本 Sales.Currency2,數據將被複製到該副本。此示例假定您使用 Windows身份驗證,並且與運行 bcp 命令所針對的伺服器實例之間具有受信任連線。
若要創建空表,可在查詢編輯器中輸入以下命令:
USE AdventureWorks;
GO
SELECT * INTO AdventureWorks.Sales.Currency2
FROM AdventureWorks.Sales.Currency WHERE 1=2
若要將字元數據大容量複製到新表(即導入數據),可在命令提示符處輸入以下命令:
bcp AdventureWorks.Sales.Currency2 in Currency.dat -T -c
若要查看命令是否成功,並在查詢編輯器中顯示錶的內容,請輸入:
USE AdventureWorks;
GO
SELECT * FROM Sales.Currency2
將特定的列複製到數據檔案中
若要複製特定列,可以使用 queryout 選項。以下示例僅將 Sales.Currency 表中的 Name 列複製到數據檔案中。此示例假定您使用 Windows身份驗證,並且與運行 bcp 命令所針對的伺服器實例之間具有受信任的連線。
在 Windows命令提示符下,輸入以下內容:
bcp "SELECT Name FROM AdventureWorks.Sales.Currency" queryout Currency.Name.dat -T -c
將特定的行複製到數據檔案中
若要複製特定行,可以使用 queryout 選項。以下示例僅將名為 Jarrod Rana 的聯繫人行從 AdventureWorks.Person.Contact 表複製到數據檔案 (Jarrod Rana.dat) 中。該示例假定您使用的是 Windows 身份驗證,並且與運行 bcp 命令的伺服器上的實例有可信連線。
在 Windows 命令提示符下,輸入以下內容:
bcp "SELECT * FROM AdventureWorks.Person.Contact WHERE FirstName="Jarrod" AND LastName="Rana" " queryout "Jarrod Rana.dat" -T -c
將數據從查詢複製到數據檔案
若要將 Transact-SQL 語句的結果集複製到數據檔案,可使用 queryout 選項。以下示例將 AdventureWorks.Person.Contact 表中的姓名複製到 Contacts.txt 數據檔案中;這些姓名先按名排序,再按姓排序。此示例假定您使用 Windows 身份驗證,並且與運行 bcp 命令所針對的伺服器實例之間具有受信任的連線。
在 Windows 命令提示符下,輸入以下內容:
bcp "SELECT FirstName, LastName FROM AdventureWorks.Person.Contact ORDER BY LastName, Firstname" queryout Contacts.txt -c -T
創建非 XML 格式檔案
AdventureWorks 資料庫中的 Sales.Currency 表的非 XML 格式檔案 Currency.fmt。此示例假定您使用 Windows 身份驗證,並且與運行 bcp 命令所針對的伺服器實例之間具有受信任的連線。
在 Windows 命令提示符下,輸入以下內容:
bcp AdventureWorks.Sales.Currency format nul -T -c -f Currency.fmt
有關詳細信息,請參閱了解非 XML 格式化檔案。
創建 XML 格式檔案
以下示例為 AdventureWorks 資料庫中的 Sales.Currency 表創建一個名為 Currency.xml 的 XML 格式檔案。此示例假定您使用 Windows 身份驗證,並且與運行 bcp 命令所針對的伺服器實例之間具有受信任的連線。
在 Windows 命令提示符下,輸入以下內容:
bcp AdventureWorks.Sales.Currency format nul -T -c -x -f Currency.xml
有關詳細信息,請參閱了解 XML 格式化檔案。
使用格式檔案進行 bcp 大容量導入
向 SQL Server 的實例導入數據時,若要使用以前創建的格式檔案,可同時使用 -f 開關和 in 選項。例如,以下命令通過使用先前創建的格式檔案(Currency.xml),將數據檔案 Currency.dat 的內容大容量複製到 Sales.Currency 表 (Sales.Currency2) 的副本中。此示例假定您使用 Windows 身份驗證,並且與運行 bcp 命令所針對的伺服器實例之間具有受信任的連線。
在 Windows 命令提示符下,輸入以下內容:
bcp AdventureWorks.Sales.Currency2 in Currency.dat -T -f Currency.xml
如果數據檔案欄位和表中的列不同(例如,在編號、排序或數據類型方面),則可使用格式檔案。