如何使用 BCP 工具

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsMicrosoft Fabric 中的倉儲Microsoft Fabric 中的 SQL 資料庫

批量複製程式工具(bcp)會在 SQL Server 實例與使用者指定格式的資料檔案間批量複製資料。

備註

  • 關於在哪裡找到或如何執行該bcp工具,以及命令提示字元工具的語法慣例,請參見 SQL 命令列工具(資料庫引擎)。

  • 如需針對大量匯入或匯出作業準備資料的相關資訊,請參閱準備大量匯出或匯入的資料

  • 如需了解大量匯入作業中執行的資料列插入發生時如何記錄到交易記錄的資訊,請參閱大量匯入採用最低限度記錄的必要條件

  • 字元<>|&^是特殊的指令殼字元,在字串中使用時,必須在前面加上跳脫字元(^),或用引號括起來,例如"StringContaining&Symbol"。 如果您使用引號來括住包含特殊字元的字串,則引號會被視為環境變數值的一部分。 欲了解更多資訊,請參見 使用額外特殊字元

  • bcp目前在 Microsoft Fabric 的 Warehouse 中處於預覽階段。

  • bcp無法在 Microsoft Fabric 的 SQL 分析端點匯入資料。

原生資料檔案支援

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

計算資料行與時間戳記資料行

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

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

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

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

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

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

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

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

    • 指定 -q 選項,或者

    • 在引號內,用方括號 ([]) 括住擁有者、資料表或檢視表名稱。

資料驗證

bcp 現在強制執行資料驗證與資料檢查,若腳本遇到資料檔案中無效資料,可能導致失敗。 例如, bcp 現在驗證:

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

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

可在舊版 SQL Server 大量匯入的無效資料形式,現在可能無法載入。不過,在舊版,除非用戶端嘗試存取無效資料,否則不會發生作業失敗的情況。 新增的驗證可以將在大量載入後查詢資料時的意外狀況減到最少。

大量匯出或是匯入 SQLXML 文件

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

資料類型 影響
SQLCHARSQLVARYCHAR 資料會傳送在用戶端代碼頁或由排序所隱含的代碼頁中。 效果與指定 -c 開關而不指定格式檔案時相同。
SQLNCHARSQLNVARCHAR 以 Unicode 格式傳送這份資料。 效果與指定 -w 開關而不指定格式檔案時相同。
SQLBINARYSQLVARYBIN 資料被傳送時未經任何轉換。

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

本節有字元模式 (-c) 與原生模式 (-n) 的建議事項。

  • (管理員/使用者) 儘可能使用原生格式 (-n),避免分隔符號問題。 使用 SQL Server 透過原生格式匯出和匯入。 如果你打算將資料匯出到非 SQL Server 資料庫,請使用 -c OR -w 選項從 SQL Server 匯出資料。

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

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

範例

本文中的程式碼範例同時使用 AdventureWorks2025WideWorldImporters 範例資料庫。 欲了解更多資訊,請參閱:

關於還原樣本資料庫的語法,請參見 RESTORE

範例測試條件

除非另有說明,以下範例假設你使用 Windows 認證,且與執行bcp指令的伺服器實例有受信任連線。 許多範例使用名為 D:\bcp的目錄。 將 <server_name> 和其他佔位符替換為您環境的對應值。

Note

連接 Azure SQL Database 的範例使用 Microsoft Entra 認證(-G)。 欲了解更多資訊,請參閱 BCP 中的 Microsoft Entra ID 認證

下列 Transact-SQL 腳本會建立 WideWorldImporters.Warehouse.StockItemTransactions 數據表的空白複本,然後新增主鍵條件約束:

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
    
  • Expanded

    這個範例會建立一個名稱為 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 <server_name> -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
    
  • Expanded

    這個範例使用先前建立的 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 <server_name> -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資料檔案中。

Note

-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 資料檔案中。

Note

使用 -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

Note

-x 切換器僅支援 Windows。

欲了解更多資訊,請參閱使用非XML格式檔案(SQL Server)XML格式檔案(SQL Server)。

一. 使用格式檔案以 bcp 批次匯入

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

Note

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

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

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

Note

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

J. 指定編碼頁

以下程式碼片段範例示範在指定字碼頁 65001 時進行 bcp 匯入:

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

K. 使用自訂欄位和資料列結束符的範例輸出檔案

此範例顯示兩個使用自訂欄位與資料列終止字元、由 bcp 產生的範例檔案。

  1. dbo.T1 資料庫中建立一個資料表 tempdb,包含兩個資料行,IDName

    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 產生輸出檔案。

    在此範例中, -t , 指定了自訂欄位終端器。 用符合你環境的價值來取代 <server_name>

    bcp dbo.T1 out T1.txt -T -S <server_name> -d tempdb -w -t ,
    

    結果如下。

    1,Natalia
    2,Mark
    3,Randolph
    
  3. 使用自訂欄位結束字元和自訂資料列結束字元,從範例資料表 dbo.T1 產生輸出檔案。

    在此範例中, -t , 指定了自訂欄位終端子,並 -r : 指定了自訂列終端子。 用符合你環境的價值來取代 <server_name>

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

    結果如下。

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

    Note

    資料列終止符號會始終新增,即使在最後一筆記錄也不例外。 然而,欄位結束字元不會被添加到最後一個欄位。

L. 將表格列複製到資料檔(Azure SQL Database)

以下範例顯示 Azure SQL Database 中 SalesLT.Customer 範例資料庫的 AdventureWorksLT 資料表上的 out 選項。 這個範例會建立一個名稱為 Customer.bcp 的資料檔案,且會利用 字元 格式,將資料表的資料複製到這個資料檔案中。 用符合你環境的價值來取代 <server_name>

Note

-G交換器啟用了 Microsoft Entra 認證功能。 欲了解更多資訊,請參閱 BCP 中的 Microsoft Entra ID 認證

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

bcp SalesLT.Customer out D:\bcp\Customer.bcp -c -S <server_name>.database.windows.net -d AdventureWorksLT -G

M. 將資料從檔案複製到表格(Azure SQL Database)

以下範例示範 Azure SQL Database 中 SalesLT.Customer 資料表上的 in 選項,並使用您先前建立的 Customer.bcp 資料檔。 用符合你環境的價值來取代 <server_name>

Note

交換器 -E 會保留資料檔案中的身份值。

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

bcp SalesLT.Customer in D:\bcp\Customer.bcp -c -S <server_name>.database.windows.net -d AdventureWorksLT -G -E

N. 將查詢資料複製到資料檔案(Azure SQL Database)

若要將 Transact-SQL 語句中的結果集複製到Azure SQL Database的資料檔案,請使用該queryout選項。 以下範例將客戶名稱從 SalesLT.Customer 資料庫中的 AdventureWorksLT 資料表複製到資料檔案中 Customer_A.txt 。 用符合你環境的價值來取代 <server_name>

Note

使用 -t 切換器建立逗號分隔檔。

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

bcp "SELECT CustomerID, FirstName, LastName, CompanyName FROM SalesLT.Customer WHERE CompanyName LIKE 'A%'" queryout D:\bcp\Customer_A.txt -t, -c -S <server_name>.database.windows.net -d AdventureWorksLT -G

其他範例

以下文章包含使用 bcp範例:

尋求幫助

參與編輯 SQL 文件

您知道您可以自行編輯 SQL 內容嗎? 如果這麼做,您不僅能協助改善我們的文件,還能被列為該頁面的貢獻者。

欲了解更多資訊,請參閱 編輯Microsoft學習文件