bcp 公用程式

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

「大量複製程式公用程式」(bcp) 會以使用者指定的格式在 Microsoft SQL Server 執行個體與資料檔案之間大量複製資料。

注意

如需在 Linux上使用 bcp ,請參閱 在Linux上安裝 SQL Server 命令行工具 sqlcmd 和 bcp。

如需搭配 Azure Synapse Analytics 使用 bcp 的詳細資訊,請參閱 使用 bcp 載入數據。

bcp 公用程式可用來將大量新資料列匯入 SQL Server 資料表,或是將資料表的資料匯出成資料檔案。 除了搭配 queryout 選項使用時,公用程式不需要瞭解 Transact-SQL。 若要將資料匯入資料表中,您必須使用專為這份資料表而建立的格式檔,或了解資料表的結構及其資料行的有效資料類型。

如需用於 bcp 語法的語法慣例,請參閱 Transact-SQL 語法慣例

注意

若您使用 bcp 備份資料,請建立格式檔案以記錄資料格式。 bcp 資料檔 不包含 任何架構或格式資訊,因此如果卸載數據表或檢視表,而且您沒有格式檔案,則可能無法匯入數據。

注意

Microsoft Entra 標識符 先前稱為 Azure Active Directory (Azure AD)。

下載最新版的 bcp 公用程式

命令行工具是正式運作(GA),不過它們會隨著 SQL Server 2019 (15.x) 和更新版本的安裝程式套件一起發行。

Windows

Linux 和 macOS

如需在Linux和macOS上安裝 sqlcmd 和 bcp 的指示,請參閱在 Linux 上安裝 SQL Server 命令行工具 sqlcmdbcp

版本資訊

  • 版本號碼:15.0.4298.1
  • 組建編號:15.0.4298.1
  • 發行日期:2023 年 4 月 7 日

新版本的 sqlcmd 支援 Microsoft Entra 驗證,包括 Azure SQL 資料庫、Azure Synapse Analytics 和 Always Encrypted 功能的多重要素驗證 (MFA) 支援。

新的 bcp 支援 Microsoft Entra 驗證,包括 Azure SQL 資料庫 和 Azure Synapse Analytics 的多重要素驗證 (MFA) 支援。

系統需求

  • Windows 8、Windows 8.1、Windows 10、Windows 11

  • Windows Server 2016、Windows Server 2019、Windows Server 2022

此元件需要最新的 Microsoft ODBC Driver 17 for SQL Server

若要檢查 bcp 版本,請執行 bcp -v 命令,並確認正在使用 15.0.4298.1 或更新版本。

注意

linux 上也提供 sqlcmdbcp 。 如需詳細資訊,請參閱 在Linux上安裝SQL Server命令行工具 sqlcmd 和 bcp。

語法

bcp [database_name.] schema.{table_name | view_name | "query"}
    {in data_file | out data_file | queryout data_file | format nul}
                                                                                                         
    [-a packet_size]
    [-b batch_size]
    [-c]
    [-C { ACP | OEM | RAW | code_page } ]
    [-d database_name]
    [-D]
    [-e err_file]
    [-E]
    [-f format_file]
    [-F first_row]
    [-G Azure Active Directory Authentication]
    [-h"hint [,...n]"]
    [-i input_file]
    [-k]
    [-K application_intent]
    [-l login_timeout]
    [-L last_row]
    [-m max_errors]
    [-n]
    [-N]
    [-o output_file]
    [-P password]
    [-q]
    [-r row_term]
    [-R]
    [-S [server_name[\instance_name]]]
    [-t field_term]
    [-T]
    [-U login_id]
    [-v]
    [-V (80 | 90 | 100 | 110 | 120 | 130 | 140 | 150 | 160 ) ]
    [-w]
    [-x]

命令列選項

database_name

指定之數據表或檢視表所在的資料庫名稱。 若未指定,這就是使用者的預設資料庫。

您也可以使用 明確指定資料庫名稱 -d

schema

數據表或檢視表的擁有者名稱。 如果執行該作業的使用者擁有指定的資料表或檢視表,則可選擇是否要使用 schema。 如果未 指定架構 ,且執行作業的用戶沒有擁有指定的數據表或檢視表,SQL Server 會傳回錯誤訊息,並取消作業。

table_name

將數據匯入 SQL Server 時的目的資料表名稱,in以及從 SQL Server () 匯出數據時的源數據表名稱out

view_name

將數據複製到 SQL Server 時的目的檢視名稱,in以及從 SQL Server 複製數據時的來源檢視名稱。out 只有所有資料行都參考相同資料表的檢視表,才能用來做為目的地檢視表。 如需將資料複製到檢視表之限制的詳細資訊,請參閱 INSERT (Transact-SQL)

“query”

傳回結果集的 Transact-SQL 查詢。 如果查詢傳回多個結果集,則只會將第一個結果集複製到資料檔案中,並會忽略接下來的結果集。 請利用雙引號括住查詢,利用單引號括住內嵌在查詢中的任何項目。 queryout 從查詢大量複製資料時,也必須指定 。

只要預存程式內參考的所有數據表在執行 bcp 語句之前,查詢就可以參考預存程式。 例如,如果預存程序產生暫存資料表,則 bcp 陳述式會失敗,這是因為暫存資料表只可在執行階段使用,而無法在陳述式執行階段使用。 在此種情況下,請考慮將預存程序的結果插入資料表中,然後使用 bcp 將資料表的資料複製到資料檔案。

從檔案複製到資料庫數據表或檢視表。 指定大量複製的方向。

out

從資料庫數據表或檢視複製到檔案。 指定大量複製的方向。

若您指定現有的檔案,將會覆寫該檔案。 擷取資料時,bcp 公用程式會以 Null 代表空白字串,並以空白字串代表 Null 字串。

data_file

數據檔的完整路徑。 當資料大量匯入 SQL Server 時,資料檔案會包含要複製到指定資料表或檢視表的資料。 從 SQL Server 大量匯出資料時,資料檔案會包含從資料表或檢視表複製的資料。 路徑可以有 1 至 255 個字元。 資料檔案最多可以包含 2^63 - 1 個資料列。

queryout

從查詢複製 ,而且只有在從查詢大量複製數據時才指定。

format

根據指定的選項 (-n、 、 -c-w-N) 和資料表或檢視分隔符,建立格式檔案。 大量複製資料時, bcp 命令可以參考格式檔案,讓您不需要以互動方式重新輸入格式資訊。 選項 format 需要 -f 選項;建立 XML 格式檔案也需要 -x 選項。 如需詳細資訊,請參閱建立格式檔案 (SQL Server)。 您必須將 指定 nul 為 值 (format nul)。

-a packet_size

指定伺服器所收送之每個網路封包的位元組數。 您可以使用 SQL Server Management Studio 來設定伺服器組態選項(或 sp_configure 系統預存程式)。 但是使用此選項可以個別地覆寫伺服器組態選項。 packet_size可以從 4096 個字節到 65,535 個字節;預設值為 4096

增加封包大小可以增強大量複製作業的效能。 如果要求較大的封包,但無法授與,則會使用預設值。 bcp 公用程式所產生的效能統計資料,會顯示所用的封包大小。

-b batch_size

指定每一批次匯入資料的資料列數。 每一批次會以個別交易的方式 (在認可之前匯入整個批次) 匯入及記錄。 根據預設,資料檔案中的所有資料列是以一個批次匯入。 若要在多個批次之間分散資料列,請指定小於資料檔案之資料列數目的 batch_size 。 如果有任何批次的交易失敗,只回復目前批次的插入項。 之後的失敗不會影響已認可的交易所匯入的批次。

請勿將此選項與 選項搭配 -h "ROWS_PER_BATCH=<bb>" 使用。

-c

利用字元資料類型來執行作業。 此選項不會提示每個欄位;它會使用 char 做為儲存類型,不含前置詞,並以 \t (Tab 字元) 作為欄位分隔符,並以 \r\n [換行符] 作為數據列終止符。 -c 與不相容 -w

如需詳細資訊,請參閱 使用字元格式匯入或匯出資料 (SQL Server)

-C { ACP |OEM |RAW | code_page }

指定資料檔案中之資料的字碼頁。 只有當資料包含字元值大於 127 或小於 32 的code_pagecode_page, varcode_page資料行時, code_page columns with code_pageacter values greater than 127 or less than 32.

注意

除非您希望 65001 選項的優先順序高於定序/字碼頁規格,否則建議您在格式檔案中指定每個資料行的定序名稱。

字碼頁值 描述
ACP ANSI/Microsoft Windows (ISO 1252)。
OEM 用戶端所用的預設字碼頁。 如果未指定,這是使用 -C 的預設代碼頁。
RAW 不會將字碼頁轉換成另一種字碼頁。 這是最快的選項,因為不進行轉換。
code_page 特定字碼頁編號;如 850。

13 版之前的版本(SQL Server 2016 (13.x)不支援代碼頁 65001(UTF-8 編碼)。 從 13 版開始,可以將 UTF-8 編碼匯入舊版的 SQL Server。

-d database_name

指定要連接的資料庫。 根據預設, bcp 會連線到用戶的預設資料庫。 如果指定 -d database_name 和三個部分名稱(database_name.schema.table,當做第一個參數傳遞至 bcp)時,就會發生錯誤,因為您無法指定資料庫名稱兩次。 如果 database_name 開頭為連字元 (-) 或正斜線 (/),請勿在 和資料庫名稱之間 -d 新增空格。

-D

使傳遞至 bcp-S 選項的值解譯為資料來源名稱 (DSN)。 DSN 可用來內嵌驅動程式選項來簡化命令行、強制執行無法從命令行存取的驅動程式選項,例如 MultiSubnetFailover,或協助保護敏感性認證,防止以命令行自變數的形式進行探索。 如需詳細資訊,請參閱使用 sqlcmd 進行連線中的 「sqlcmd 和 bcp 中的 DSN 支援」。

-e err_file

指定錯誤檔案的完整路徑,用來儲存 bcp 公用程式無法從檔案傳輸到資料庫的任何數據列bcp 命令所產生的錯誤訊息,會送往使用者的工作站。 如果未使用此選項,則不會建立錯誤檔案。

如果err_file開頭為連字元 (-) 或正斜線 (/),則不包含 與 err_file 值之間的-e空格。

-E

指定識別欄位要使用匯入之資料檔案中的一個或多個識別值。 如果未 -E 指定,則會忽略要匯入之數據檔中這個數據行的識別值,而且 SQL Server 會根據資料表建立期間指定的種子和增量值自動指派唯一值。 如需詳細資訊,請參閱 DBCC CHECKIDENT

如果數據檔不包含資料表或檢視中標識列的值,請使用格式檔案來指定匯入數據時應該略過數據表或檢視中的標識列;SQL Server 會自動指派數據行的唯一值。

此選項 -E 具有特殊許可權需求。 如需詳細資訊,請參閱本文稍後的<備註>。

-f format_file

指定格式檔的完整路徑。 此選項的意義取決於其所使用的環境,如下所示:

  • 如果 -f 與 選項搭配 format 使用,則會為指定的數據表或檢視建立指定的 format_file 。 若要建立 XML 格式檔案,請同時指定 -x 選項。 如需詳細資訊,請參閱建立格式檔案 (SQL Server)

  • 如果搭配 inout 選項使用, -f 則需要現有的格式檔案。

    注意

    在 中搭配 inout 選項使用格式檔案是選擇性的。 -f如果沒有選項,如果未-n指定 、-c-w-N ,命令會提示格式資訊,並可讓您將回應儲存在格式檔案中(其預設檔名為 bcp.fmt)。

如果format_file開頭為連字元 (-) 或正斜線 (/),則不包含 與 format_file 值之間的-f空格。

-F first_row

指定要從資料表匯出或從資料檔案匯入之第一個資料列的號碼。 此參數需要大於 () 0 但小於 (><) 或等於 (=) 總計數據列的值。 如果沒有這個參數,預設值是檔案中的第一個資料列。

first_row 可以是值高達 2^63-1 的正整數。 -F first_row是以 1 為基礎。

-G

適用於:僅限 Azure SQL 資料庫 和 Azure Synapse Analytics。

當連線到 Azure SQL 資料庫 或 Azure Synapse Analytics 時,用戶端會使用此參數來指定使用者是否使用 Microsoft Entra ID 進行驗證。 -G 參數需要 14.0.3008.27 版或更新版本。 若要判斷您的版本,請執行 bcp -v。 如需詳細資訊,請參閱搭配 SQL 資料庫 或 Azure Synapse Analytics 使用 Microsoft Entra 驗證。

重要

Linux 或 macOS 目前不支援 Microsoft Entra 互動式驗證。 Microsoft Entra 整合式驗證需要 Microsoft ODBC Driver 17 for SQL Server 17.6.1 版和更新版本,以及正確設定的 Kerberos 環境

提示

若要檢查您的 bcp 版本是否包含 Microsoft Entra 驗證的支援,請輸入bcp --help並確認您在可用自變數清單中看到-G

  • Microsoft Entra 使用者名稱和密碼

    當您想要使用 Microsoft Entra 使用者名稱和密碼時,您可以提供 選項,並藉由提供 -G-U-P 選項來使用使用者名稱和密碼。

    下列範例會使用 Microsoft Entra 使用者名稱和密碼認證來匯出數據。 此範例會從 aadserver.database.windows.net Azure 伺服器的 testdb 資料庫匯出 bcptest 資料表,並將資料儲存在 c:\last\data1.dat 檔案中:

    bcp bcptest out "c:\last\data1.dat" -c -t -S aadserver.database.windows.net -d testdb -G -U alice@aadtest.onmicrosoft.com -P xxxxx
    

    下列範例會使用 Microsoft Entra 使用者的認證匯入數據。 此範例會使用 Microsoft Entra 使用者名稱和密碼,將資料從檔案c:\last\data1.dat匯入 Azure 伺服器上的aadserver.database.windows.net資料庫testdb資料表bcptest

    bcp bcptest in "c:\last\data1.dat" -c -t -S aadserver.database.windows.net -d testdb -G -U alice@aadtest.onmicrosoft.com -P xxxxx
    
  • Microsoft Entra 整合

    針對 Microsoft Entra 整合式驗證,請提供 -G 不含使用者名稱或密碼的選項。 此組態要求目前的 Windows 用戶帳戶(bcp 命令正在執行的帳戶)與 Microsoft Entra ID 同盟:

    下列範例會使用 Microsoft Entra 整合式驗證導出數據。 此範例會使用與 Microsoft Entra ID 同盟的 Windows 認證,從邏輯伺服器上的aadserver.database.windows.net資料庫testdb導出數據表bcptest,並將數據儲存在檔案c:\last\data2.dat中:

    bcp bcptest out "c:\last\data2.dat" -S aadserver.database.windows.net -d testdb -G -c -t
    

    下列範例會使用 Microsoft Entra 整合式驗證匯入數據。 此範例會使用與 Microsoft Entra ID 同盟的 Windows 認證,將數據從檔案數據表c:\last\data2.dat匯入邏輯伺服器上的aadserver.database.windows.net數據表bcptesttestdb

    bcp bcptest in "c:\last\data2.dat" -S aadserver.database.windows.net -d testdb -G -c -t
    
  • Microsoft Entra 互動式

    Microsoft Entra 互動式驗證適用於所有 Azure SQL 和 SQL Server 2022+,可讓您使用互動式對話框進行驗證,這也支援多重要素驗證。

    Microsoft Entra 互動式驗證需要 bcp15.0.1000.34 版或更新版本,以及 ODBC 17.2 版或更新版本

    若要啟用互動式驗證,請僅提供 -G 使用者名稱 (-U) 的選項,且沒有密碼。

    下列範例會使用 Microsoft Entra 互動式驗證匯出數據,其中包括指定 Microsoft Entra 帳戶的用戶名稱。

    互動式模式需要手動輸入密碼,或針對已啟用多重要素驗證的帳戶,完成您設定的 MFA 驗證方法。

    bcp bcptest out "c:\last\data1.dat" -c -t -S aadserver.database.windows.net -d testdb -G -U alice@aadtest.onmicrosoft.com
    

    如果使用來自同盟網域之 Windows 帳戶的 Microsoft Entra 使用者,命令列中輸入的使用者名稱必須包含其網域(例如): joe@contoso.com

    bcp bcptest out "c:\last\data1.dat" -c -t -S aadserver.database.windows.net -d testdb -G -U joe@contoso.com
    

    如果來賓使用者存在於特定的 Microsoft Entra 租使用者中,且屬於 SQL 資料庫 中具有執行 bcp 命令之資料庫許可權的群組的一部分,則會使用其來賓使用者別名 (例如 , keith0@adventure-works.com

-h “hints [, ... n]”

指定要在將數據大容量導入資料表或檢視表期間使用的提示或提示。

  • ORDER (數據行 [ASC |DESC] [, ...n])

    資料檔案中之資料的排序順序。 如果匯入資料時是依照資料表的叢集索引來排序,將可提升大量匯入的效能。 如果數據檔以不同的順序排序,也就是叢集索引鍵的順序,或數據表上沒有叢集索引,則會忽略 ORDER 子句。 提供的資料行名稱必須是目的地資料表中的有效資料行名稱。 根據預設, bcp 會假設資料檔案沒有排序。 為了達到最佳的大量匯入效果,SQL Server 也會驗證匯入的資料是否已排序。

  • ROWS_PER_BATCH = bb

    每一批資料的資料列數目 (如 bb)。 未指定時 -b 使用,導致整個數據檔以單一交易的形式傳送至伺服器。 伺服器根據 bb 值,將大量載入最佳化。 根據預設,ROWS_PER_BATCH 是未知的。

  • KILOBYTES_PER_BATCH = cc

    每一批資料的近似 KB 數 (如 cc)。 依預設,KILOBYTES_PER_BATCH 是未知的。

  • TABLOCK

    指定在大量載入作業期間,取得大量更新資料表層級鎖定;否則,便取得資料列層級鎖定。 這個提示會大幅提升效能,因為在大量複製作業期間保留鎖定,會減少競爭資料表鎖定的情況。 如果資料表沒有索引,且指定了 TABLOCK ,多個用戶端便可以同時載入這份資料表。 根據預設,鎖定行為由資料表選項 table lock on bulk load決定。

    注意

    如果目標數據表是叢集數據行存放區索引,則多個並行用戶端不需要 TABLOCK 提示,因為每個並行線程都會在索引內指派個別的數據列群組,並將數據載入其中。 如需詳細資訊,請參閱數據行存放區索引概念性文章:

  • CHECK_CONSTRAINTS

    指定在大量匯入作業期間,必須檢查目標資料表或檢視表的所有條件約束。 當沒有 CHECK_CONSTRAINTS 提示時,會忽略所有 CHECK 和 FOREIGN KEY 條件約束,在作業之後,會將資料表的條件約束標記為不受信任。

    注意

    一律強制實施 UNIQUE、PRIMARY KEY 和 NOT NULL 條件約束。

    在某些時候,您必須檢查整個數據表的條件約束。 如果大容量導入作業前的數據表未清空,重新驗證條件約束的成本可能會超過將 CHECK 條件約束套用至累加數據的成本。 因此,建議您在進行累加大量匯入期間,通常要啟用條件約束檢查。

    如果輸入資料包含違反條件約束的資料列,您可能會想停用條件約束 (預設行為)。 停用 CHECK 條件約束后,您可以匯入數據,然後使用 Transact-SQL 語句來移除無效的數據。

    注意

    bcp 現在會強制執行數據驗證和數據檢查,如果腳本在數據檔中的無效數據上執行,可能會導致腳本失敗。

    注意

    -mmax_errors參數不適用於條件約束檢查。

  • FIRE_TRIGGERS

    使用 in 自變數指定,目的地數據表上定義的任何插入觸發程式都會在大量複製作業期間執行。 如果未指定FIRE_TRIGGERS,則不會執行插入觸發程式。 、 和 format 自變數會outqueryout忽略FIRE_TRIGGERS。

-i input_file

指定回應檔的名稱,其中包含使用互動式模式執行大量複製時,每個數據欄位命令提示字元問題的回應。-n-c-w-N

如果input_file開頭為連字元 (-) 或正斜線 (/),則不包含 與 input_file 值之間的-i空格。

-k

指定空白資料行在作業過程中應保持 Null 值,而非保有插入之資料行的任何預設值。 如需詳細資訊,請參閱 大容量導入期間保留 Null 或預設值。

-K application_intent

宣告連接到伺服器時的應用程式工作負載類型。 唯一可能的值是 ReadOnly。 如果未 -K 指定, bcp 公用程式不支持連線至 Always On 可用性群組中的次要複本。 如需詳細資訊,請參閱 將只讀工作負載卸除至Always On可用性群組的次要複本。

-l login_timeout

指定登入逾時。 -l 選項會指定在您嘗試連線到伺服器時,登入 SQL Server 逾時之前的秒數。 預設登入逾時為 15 秒。 登入逾時必須是介於 0 與 65534 之間的數字。 如果所提供的值不是數值或不屬於該範圍, bcp 會產生錯誤訊息。 值為 0 指定無限的逾時時間。

-L last_row

指定要從資料表匯出或從資料檔案匯入的最後一個資料列的號碼。 此參數需要大於 () 0 但小於 (><) 或等於 (=) 最後一個數據列數目的值。 如果沒有這個參數,預設值是檔案中的最後一個資料列。

last_row 可以是值高達 2^63-1 的正整數。

-m max_errors

指定 bcp 作業取消前,可以出現的語法錯誤數上限。 語法錯誤也暗示著對於目的地資料類型的資料轉換錯誤。 max_errors 總計將只能在伺服器偵測的錯誤排除在外,例如條件約束違規。

bcp 公用程式無法複製的數據列會被忽略,並計算為一個錯誤。 如果未包含此選項,則預設值為10。

注意

此選項 -m 也適用於轉換 moneybigint 資料類型。

-n

利用資料的原生 (資料庫) 資料類型來執行大量複製作業。 此選項不會提示每個欄位;它會使用原生值。

如需詳細資訊,請參閱使用原生格式匯入或匯出數據(SQL Server)。

-N

如果是非字元資料,請使用資料的原生 (資料庫) 資料類型執行大量複製作業;如果是字元資料,請使用 Unicode 字元執行大量複製作業。 此選項提供選項的效能較高替代方案 -w ,其用途是使用數據檔,將數據從一個SQL Server 實例傳輸到另一個實例。 它不會提示每個欄位。 當您傳輸包含 ANSI 擴充字元的數據,而且您想要利用原生模式的效能時,請使用此選項。

如需詳細資訊,請參閱使用 Unicode 原生格式匯入或匯出資料 (SQL Server)

如果您使用 bcp 搭配 -N匯出數據,然後將數據匯入至相同的數據表架構,則如果長度固定、非 Unicode 字元數據行(例如 char(10),您可能會看到截斷警告。

可以忽略此警告。 解決此警告的其中一種方法是使用 -n 而非 -N

-o output_file

指定接收來自命令提示字元重新導向之輸出的檔案名稱。

如果output_file開頭為連字元 (-) 或正斜線 (/),則不包含 與 output_file 值之間的-o空格。

-P password

指定登入識別碼的密碼。 如果未使用此選項, bcp 命令會提示輸入密碼。 如果在未使用密碼的情況下,於命令提示字元尾端使用此選項, bcp 就會使用預設密碼 (NULL)。

重要

請勿使用空白密碼。 請使用增強式密碼。

若要遮罩您的密碼,請勿指定 -P 選項以及 -U 選項。 相反地,在 指定 bcp 以及 -U 選項和其他參數之後(不要指定 -P),請按 ENTER 鍵,命令會提示您輸入密碼。 此方法可確保密碼在輸入時會遮罩。

如果密碼以連字元 () 或正斜線開頭-/,請勿在 與密碼值之間-P新增空格。

-q

bcp 公用程式與 SQL Server 執行個體之間的連線中,執行 SET QUOTED_IDENTIFIERS ON 陳述式。 請利用這個選項來指定包含空格或單引號的資料庫、擁有者、資料表或檢視表名稱。 請用引號 ("") 括住整個三部分資料表或檢視表名稱。

若要指定包含空格或單引號的資料庫名稱,您必須使用 -q 選項。

-q 不適用於傳遞至 -d的值。

如需詳細資訊,請參閱本文稍後的<備註>。

-r row_term

指定資料列結束字元。 預設值是 \n (新行字元)。 請利用這個參數來覆寫預設的資料列結束字元。 如需詳細資訊,請參閱指定欄位與資料列結束字元 (SQL Server)

如果您在 bcp 命令中以十六進位表示法指定數據列終止符,該值會在 截斷0x00 例如,如果您指定 0x4100410x41 則會使用 。

如果row_term開頭為連字元 (-) 或正斜線 (/),則不包含 與 row_term 值之間的-r空格。

-R

指定要使用針對用戶端電腦地區設定定義的區域格式,將貨幣、日期和時間資料大量複製到 SQL Server 中。 依預設,會忽略地區設定。

-S server_name [\instance_name]

指定要連線的 SQL Server 執行個體。 如果未指定任何伺服器,bcp 公用程式會連接至本機電腦的 SQL Server 預設執行個體。 透過網路上的遠端電腦或本機具名執行個體執行 bcp 指令時,此選項為必要選項。 若要連線至伺服器上的 SQL Server 預設執行個體,只要指定 server_name。 若要連接至 SQL Server 的具名執行個體,請指定 server_name**\**instance_name

-t field_term

指定欄位結束字元。 預設值是 \t (定位字元)。 請利用這個參數來覆寫預設的欄位結束字元。 如需詳細資訊,請參閱指定欄位與資料列結束字元 (SQL Server)

如果您在 bcp 命令中以十六進位表示法指定字段終止符,該值會在 截斷0x00 例如,如果您指定 0x4100410x41 則會使用 。

如果field_term開頭為連字元 (-) 或正斜線 (/),則不包含 與 field_term 值之間的-t空格。

-T

指定 bcp 公用程式使用整合式安全性的信任連線來連線至 SQL Server。 不需要網路使用者、 login_id密碼的安全性認證 。 如果未 -T 指定,您必須指定 -U-P 成功登入。

重要

當 bcp 公用程式使用整合式安全性連接到具有受信任連線的 SQL Server 時,請使用 -T 選項(信任連接),而不是使用者名稱和密碼組合。 當 bcp 公用程式連線到 SQL 資料庫 或 Azure Synapse Analytics 時,不支援使用 Windows 驗證 或 Microsoft Entra 驗證。 -U使用和 -P 選項。

-U login_id

指定用來連線至 SQL Server 的登入識別碼。

-v

報告 bcp 公用程式版本號碼和著作權。

-V (80 | 90 | 100 | 110 | 120 | 130 | 140 | 150 | 160)

利用舊版 SQL Server 的資料類型執行大量複製作業。 此選項不會提示每個欄位;它會使用預設值。

80 = SQL Server 2000 (8.x)

90 = SQL Server 2005 (9.x)

100 = SQL Server 2008 (10.0.x) 和 SQL Server 2008 R2 (10.50.x)

110 = SQL Server 2012 (11.x)

120 = SQL Server 2014 (12.x)

130 = SQL Server 2016 (13.x)

140 = SQL Server 2017 (14.x)

150 = SQL Server 2019 (15.x)

160 = SQL Server 2022 (16.x)

例如,若要產生 SQL Server 2000 (8.x) 不支援但是在更新版的 SQL Server 中導入的資料類型,請使用 -V80 選項。

如需詳細資訊,請參閱 從舊版 SQL Server 匯入原生和字元格式數據。

-w

利用 Unicode 字元執行大量複製作業。 此選項不會提示每個欄位;它會使用 nchar 做為儲存類型、無前置詞、 \t (製表元)做為欄位分隔符,而 \n (換行字元) 作為數據列終止符。 -w 與不相容 -c

如需詳細資訊,請參閱使用 Unicode 字元格式匯入或匯出數據(SQL Server)。

-x

此選項會與 和 -fformat_file 選項搭配format使用,併產生 XML 格式檔案,而不是預設的非 XML 格式檔案。 匯 -x 入或匯出數據時無法運作。 如果沒有和 format-fformat_file,就會產生錯誤。

備註

  • 安裝 Microsoft SQL Server 2019 (15.x) 工具時,就會安裝 bcp 13.0 用戶端。 如果同時多個版本的 SQL Server 安裝工具,則根據 PATH 環境變數值順序的不同,您也可以使用舊版的 bcp 用戶端來取代 bcp 13.0 用戶端。 這個環境變數定義了 Windows 用來搜尋可執行檔的一組目錄。 若要探索您使用的版本,請在 Windows 命令提示字元中執行 bcp -v 命令。 如需如何在 PATH 環境變數中設定命令路徑的詳細資訊,請參閱環境變數 (英文) 或在 Windows 說明中搜尋環境變數。

    若要確定 bcp 公用程式的最新版本正在執行,您需要移除任何舊版的 bcp 公用程式。

    若要判斷安裝 bcp 公用程式的所有版本的位置,請在命令提示字元中輸入:

    where bcp.exe
    
  • bcp 公用程式也可以與 Microsoft SQL Server 2016 Feature Pack 分開下載。 選取 ENU\x64\MsSqlCmdLnUtils.msiENU\x86\MsSqlCmdLnUtils.msi

  • 只有在同時安裝 SQL Server 工具和 SQL Server Native Client 時,才能支援 XML 格式檔案。

  • 如需何處尋找或如何執行 bcp 公用程式及命令提示字元公用程式語法慣例的相關信息,請參閱 SQL 命令提示字元公用程式 (資料庫引擎)。

  • 如需準備大容量導入或匯出作業之數據的資訊,請參閱 準備大容量匯出或匯入的數據。

  • 如需大容量導入所執行之數據列插入作業何時記錄在事務歷史記錄中的資訊,請參閱 大容量導入中最低限度記錄的必要條件。

  • 使用其他特殊字元

    <字元 、>|&^ 是特殊的命令殼層字元,而且它們前面必須加上逸出字元 (^),或在 String 中使用時以引弧括住 (例如 , "StringContaining&Symbol"。 如果您使用引號來括住包含特殊字元的字串,則引號會被視為環境變數值的一部分。

原生數據文件支援

在 SQL Server 中,bcp 公用程式支援與從 SQL Server 2000 (8.x) 及更新版本開始的 SQL Server 版本相容的原生資料檔案。

計算數據行和時間戳數據行

會忽略針對計算資料行或 timestamp 資料行匯入之資料檔案中的值,而且 SQL Server 會自動指派值。 如果資料檔不包含資料表中計算或 時間戳 數據行的值,請使用格式檔案來指定匯入數據時應該略過數據表中的計算或 時間戳 數據行;SQL Server 會自動指派數據行的值。

計算資料行和 timestamp 資料行會照常從 SQL Server 大量複製到資料檔案中。

指定包含空格或引號的識別碼

SQL Server 識別碼可以包括內嵌空格和引號之類的字元。 您必須依照下列方式來處理這些識別碼:

  • 當您在命令提示字元之下,指定包含空格或引號的識別碼或檔案名稱時,請用引號 ("") 括住識別碼。

    例如,下列 bcp out 命令會建立名稱為 Currency Types.dat的資料檔案:

    bcp AdventureWorks2022.Sales.Currency out "Currency Types.dat" -T -c
    
  • 若要指定包含空格或引號的資料庫名稱,您必須使用 -q 選項。

  • 如果擁有者、資料表或檢視表名稱包含內嵌的空格或引號,您可以執行下列動作:

    • -q指定 選項,或

    • 將擁有者、數據表或檢視名稱括在引號內方括弧 ([]) 內。

資料驗證

bcp 現在會強制執行數據驗證和數據檢查,如果腳本在數據檔中的無效數據上執行,可能會導致腳本失敗。 例如, bcp 現在會驗證:

  • float 或 real 資料類型的原生表示法是否有效。

  • Unicode 資料的長度是否為偶數位元組。

無法在舊版 SQL Server 中大容量導入的無效數據形式現在無法載入;而在舊版中,除非客戶端嘗試存取無效的數據,否則不會發生失敗。 新增的驗證會使大量載入之後的資料查詢,將出現意外的狀況減到最少。

大容量匯出或匯入 SQLXML 檔

若要大量匯出或匯入 SQLXML 資料,請在格式檔案中使用下列其中一種資料類型。

資料類型 效果
SQLCHAR 或 SQLVARYCHAR 資料是使用用戶端字碼頁或定序所隱含的字碼頁所傳送。 效果與指定 -c 參數相同,而不指定格式檔案。
SQLNCHAR 或 SQLNVARCHAR 以 Unicode 格式傳送這份資料。 效果與指定 -w 參數相同,而不指定格式檔案。
SQLBINARY 或 SQLVARYBIN 未經任何轉換即傳送這份資料。

權限

作業 bcp out 需要源數據表的SELECT許可權。

作業 bcp in 只需要目標數據表的SELECT/INSERT許可權。 此外,如果下列任一條件成立,則需要 ALTER TABLE 許可權:

  • 條件約束存在,且未指定CHECK_CONSTRAINTS提示。

    注意

    停用條件約束是預設行為。 若要明確啟用條件約束,請使用 -h 選項搭配CHECK_CONSTRAINTS提示。

  • 觸發程式存在,且未指定FIRE_TRIGGER提示。

    注意

    依預設不會引發觸發程序。 若要明確引發觸發程式,請使用 -h 選項搭配FIRE_TRIGGERS提示。

  • 您可以使用 -E 選項從資料檔案匯入識別值。

注意

在 SQL Server 2005 (9.x) 中,目標資料表的 ALTER TABLE 權限是一項新的需求。 如果使用者帳戶缺少目標數據表的 ALTER 數據表許可權,這項新需求可能會導致 不會強制執行觸發程式和條件約束檢查的 bcp 腳本失敗。

字元模式 (-c) 和原生模式 (-n) 最佳做法

本節提供字元模式 (-c) 和原生模式 (-n) 的建議。

  • (管理員 istrator/User) 可能的話,請使用原生格式 (-n) 以避免分隔符問題。 使用 SQL Server 透過原生格式匯出和匯入。 如果數據將匯入至非 SQL Server 資料庫,請使用 -c-w 選項從 SQL Server 匯出數據。

  • (管理員) 使用 BCP OUT 時確認資料。 例如,當您使用 BCP OUT、BCP IN 和 BCP OUT 時,請確認資料已正確匯出,而且終止符值不會當做某些數據值的一部分使用。 請考慮使用隨機十六進位值來覆寫預設結束字元 (使用 -t 和 -r 選項),避免結束字元值與資料值之間發生衝突。

  • (使用者) 使用長且唯一的結束字元 (任何位元組或字元序列),將實際字串值發生衝突的可能性降到最低。 這可透過使用 -t 和 -r 選項完成。

範例

本節中的範例會使用 WideWorldImporters SQL Server 2016(13.x) 和更新版本的範例資料庫、Azure SQL 資料庫 和 Azure SQL 受控執行個體。 您可以從 https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0 下載 WideWorldImporters 。 如需還原範例資料庫的語法,請參閱 RESTORE (TRANSACT-SQL)

範例測試條件

除非另有指定,否則範例會假設您使用 Windows 驗證,且與執行 bcp 命令的伺服器實例有信任的連線。 許多範例都會使用名為 D:\BCP 的目錄。

下列腳本會建立數據表的 WideWorldImporters.Warehouse.StockItemTransactions 空白複本,然後新增主鍵條件約束。 在 SQL Server Management Studio (SSMS) 中執行下列 T-SQL 指令碼

USE WideWorldImporters;
GO

SET NOCOUNT ON;

IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Warehouse.StockItemTransactions_bcp')
BEGIN
    SELECT * INTO WideWorldImporters.Warehouse.StockItemTransactions_bcp
    FROM WideWorldImporters.Warehouse.StockItemTransactions
    WHERE 1 = 2;

    ALTER TABLE Warehouse.StockItemTransactions_bcp
    ADD CONSTRAINT PK_Warehouse_StockItemTransactions_bcp PRIMARY KEY NONCLUSTERED
    (StockItemTransactionID ASC);
END

注意

視需要截斷 StockItemTransactions_bcp 資料表。

TRUNCATE TABLE WideWorldImporters.Warehouse.StockItemTransactions_bcp;

A. 識別 bcp 公用程式版本

請在命令提示字元之下,輸入下列命令:

bcp -v

B. 將資料表資料列複製到資料檔案中(具有信任的連線)

下列範例說明 out 數據表上的 WideWorldImporters.Warehouse.StockItemTransactions 選項。

  • 基本

    這個範例會建立一個名稱為 StockItemTransactions_character.bcp 的資料檔案,且會利用 字元 格式,將資料表的資料複製到這個資料檔案中。

    請在命令提示字元之下,輸入下列命令:

    bcp WideWorldImporters.Warehouse.StockItemTransactions out D:\BCP\StockItemTransactions_character.bcp -c -T
    
  • 擴大

    此範例會建立名為 StockItemTransactions_native.bcp 的數據檔,並使用原生格式將數據表數據複製到其中。 此範例也指定語法錯誤的數目上限、錯誤檔和輸出檔。

    請在命令提示字元之下,輸入下列命令:

    bcp WideWorldImporters.Warehouse.StockItemTransactions OUT D:\BCP\StockItemTransactions_native.bcp -m 1 -n -e D:\BCP\Error_out.log -o D:\BCP\Output_out.log -S -T
    

檢閱 Error_out.logOutput_out.logError_out.log 應為空白。 比較 StockItemTransactions_character.bcpStockItemTransactions_native.bcp之間的檔案大小。

C. 將資料表資料列複製到資料檔案中(使用混合模式驗證)

下列範例說明 out 數據表上的 WideWorldImporters.Warehouse.StockItemTransactions 選項。 這個範例會建立一個名稱為 StockItemTransactions_character.bcp 的資料檔案,且會利用 字元 格式,將資料表的資料複製到這個資料檔案中。

此範例假設您使用混合模式驗證,而且您必須使用 -U 參數來指定登入標識碼。 此外,除非您連線到本機計算機上的 SQL Server 預設實例,否則請使用 -S 參數來指定系統名稱,並選擇性地指定實例名稱。

在命令提示字元中,輸入下列命令:(系統提示您輸入密碼。

bcp WideWorldImporters.Warehouse.StockItemTransactions out D:\BCP\StockItemTransactions_character.bcp -c -U<login_id> -S<server_name\instance_name>

D. 將數據從檔案複製到數據表

下列範例說明 in 使用先前建立的檔案, WideWorldImporters.Warehouse.StockItemTransactions_bcp 在數據表上使用 選項。

  • 基本

    此範例會使用先前建立的 StockItemTransactions_character.bcp 數據檔。

    請在命令提示字元之下,輸入下列命令:

    bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp IN D:\BCP\StockItemTransactions_character.bcp -c -T
    
  • 擴大

    此範例會使用先前建立的 StockItemTransactions_native.bcp 數據檔。 此範例也:使用提示 TABLOCK,指定批次大小、語法錯誤數目上限、錯誤檔案和輸出檔案。

    請在命令提示字元之下,輸入下列命令:

    bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp IN D:\BCP\StockItemTransactions_native.bcp -b 5000 -h "TABLOCK" -m 1 -n -e D:\BCP\Error_in.log -o D:\BCP\Output_in.log -S -T
    

    檢閱 Error_in.logOutput_in.log

E. 將特定數據列複製到資料檔

若要複製特定資料行,您可以使用 queryout 選項。 下列範例只會將 StockItemTransactionID 資料表的 Warehouse.StockItemTransactions 資料行複製到資料檔案中。

請在命令提示字元之下,輸入下列命令:

bcp "SELECT StockItemTransactionID FROM WideWorldImporters.Warehouse.StockItemTransactions WITH (NOLOCK)" queryout D:\BCP\StockItemTransactionID_c.bcp -c -T

F. 將特定數據列複製到數據檔

若要複製特定資料列,您可以使用 queryout 選項。 下列範例只會將 Amy Trefl 資料表中名稱為 WideWorldImporters.Application.People 之連絡人的資料列複製到 Amy_Trefl_c.bcp資料檔案中。

注意

參數 -d 會用來識別資料庫。

請在命令提示字元之下,輸入下列命令:

bcp "SELECT * from Application.People WHERE FullName = 'Amy Trefl'" queryout D:\BCP\Amy_Trefl_c.bcp -d WideWorldImporters -c -T

G. 將數據從查詢複製到資料檔

若要將結果集從 Transact-SQL 語句複製到資料檔,請使用 queryout 選項。 下列範例會依照全名的方式,將 WideWorldImporters.Application.People 資料表中的名稱複製到 People.txt 資料檔案中。

注意

參數 -t 是用來建立逗號分隔的檔案。

請在命令提示字元之下,輸入下列命令:

bcp "SELECT FullName, PreferredName FROM WideWorldImporters.Application.People ORDER BY FullName" queryout D:\BCP\People.txt -t, -c -T

H. 建立格式檔案

下列範例會針對 Warehouse.StockItemTransactions 資料庫中的 WideWorldImporters 資料表來建立三個不同的格式檔案。 檢閱每個建立檔案的內容。

請在命令提示字元之下,輸入下列命令:

REM non-XML character format
bcp WideWorldImporters.Warehouse.StockItemTransactions format nul -f D:\BCP\StockItemTransactions_c.fmt -c -T

REM non-XML native format
bcp WideWorldImporters.Warehouse.StockItemTransactions format nul -f D:\BCP\StockItemTransactions_n.fmt -n -T

REM XML character format
bcp WideWorldImporters.Warehouse.StockItemTransactions format nul -f D:\BCP\StockItemTransactions_c.xml -x -c -T

注意

若要使用 -x 參數,您必須使用 bcp 9.0 用戶端。 如需有關如何使用 bcp 9.0 用戶端的詳細資訊,請參閱備註一節。

如需詳細資訊,請參閱使用非 XML 格式檔案 (SQL Server)XML 格式檔案 (SQL Server)。

I. 使用格式檔案以 bcp 大容量導入

若要在將數據匯入 SQL Server 實例時使用先前建立的格式檔案,請使用 -f 參數搭配 in 選項。 例如,下列命令會利用先前建立的格式檔案 StockItemTransactions_character.bcp,將 Warehouse.StockItemTransactions_bcp 資料檔案的內容大量複製到 StockItemTransactions_c.xml資料表的複本中。

注意

參數 -L 僅用來匯入前 100 筆記錄。

請在命令提示字元之下,輸入下列命令:

bcp WideWorldImporters.Warehouse.StockItemTransactions_bcp in D:\BCP\StockItemTransactions_character.bcp -L 100 -f D:\BCP\StockItemTransactions_c.xml -T

注意

當資料檔案欄位與資料表資料行不同 (如號碼、排序或資料類型) 時,格式檔案就非常有用。 如需詳細資訊,請參閱 格式化檔案以匯入或匯出資料 (SQL Server)

J. 指定字碼頁

下列部分程式代碼範例顯示 bcp 匯入,同時指定代碼頁 65001:

bcp MyTable in "D:\data.csv" -T -c -C 65001 -t , ...

K. 使用自訂欄位和數據列終止符的範例輸出檔案

此範例示範 bcp 使用自定義欄位和數據列終止符所產生的兩個範例檔案。

  1. tempdb資料庫中建立具有兩個數據行IDName的數據表dbo.T1

    USE tempdb;
    GO
    
    CREATE TABLE dbo.T1 (ID INT, [Name] NVARCHAR(20));
    GO
    
    INSERT INTO dbo.T1 VALUES (1, N'Natalia');
    INSERT INTO dbo.T1 VALUES (2, N'Mark');
    INSERT INTO dbo.T1 VALUES (3, N'Randolph');
    GO
    
  2. 使用自定義欄位終止符,從範例數據表 dbo.T1產生輸出檔案。

    在此範例中,伺服器名稱為 MYSERVER,而自定義欄位終止符是由 指定 -t ,

    bcp dbo.T1 out T1.txt -T -S MYSERVER -d tempdb -w -t ,
    

    以下為結果集。

    1,Natalia
    2,Mark
    3,Randolph
    
  3. 使用自定義欄位終止符和自訂資料列終止符,從範例數據表 dbo.T1產生輸出檔。

    在此範例中,伺服器名稱為 MYSERVER、自定義欄位終止符由 -t ,指定,而自定義數據列終止符則由 -r :指定。

    bcp dbo.T1 out T1.txt -T -S MYSERVER -d tempdb -w -t , -r :
    

    以下為結果集。

    1,Natalia:2,Mark:3,Randolph:
    

    注意

    數據列終止符一律會新增至最後一筆記錄。 不過,欄位終止符不會新增至最後一個字段。

其他範例

下列文章包含使用 bcp 的範例:

考量與限制

  • bcp 公用程式有錯誤訊息只顯示512位元組位元元的限制。 只會顯示錯誤訊息的前 512 個位元組。

取得協助

參與編輯 SQL 文件

您知道您可以自行編輯 SQL 內容嗎? 這樣做不僅可以協助改善文件,也能名列該頁面的參與者。

如需詳細資訊,請參閱如何參與 SQL Server 文件