bcp 公用程式
適用於:Microsoft Fabric 中的 SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW)SQL Database
「大量複製程式公用程式」(bcp) 會以使用者指定的格式在 Microsoft SQL Server 執行個體與資料檔案之間大量複製資料。
若要在 Linux 使用 bcp,請參閱 在 Linux 安裝 SQL Server 命令列工具 sqlcmd 和 bcp。 如需使用 bcp 搭配 Azure Synapse Analytics 的詳細資訊,請參閱使用 bcp 載入資料。
bcp 公用程式可用來將大量新資料列匯入 SQL Server 資料表,或是將資料表的資料匯出成資料檔案。 除了搭配 queryout
選項使用之外,此公用程式不需要任何 Transact-SQL 方面的知識。 若要將資料匯入資料表中,您必須使用專為這份資料表而建立的格式檔,或了解資料表的結構及其資料行的有效資料類型。
注意
若您使用 bcp 備份資料,請建立格式檔案以記錄資料格式。 bcp 資料檔案不包含任何結構描述或格式資訊,所以如果資料表或檢視表遭到卸除,而您又沒有格式檔案,可能就無法匯入資料。
如需用於 bcp 語法的語法慣例,請參閱 Transact-SQL 語法慣例。
下載最新版本的 bcp 公用程式
命令列工具已正式發行,不過將透過 SQL Server 2019 (15.x) 與更新版本的安裝程式套件發行。
Windows
- 下載 ODBC Driver for SQL Server
- 下載適用於 SQL Server 的 Microsoft 命令列公用程式 15 (x64)
- 下載適用於 SQL Server 的 Microsoft 命令列公用程式 15 (x86)
Linux 與 macOS
如需在 Linux 和 macOS 安裝 sqlcmd 與 bcp 的指示,請參閱在 Linux 安裝 SQL Server 命令列工具 sqlcmd 與 bcp。
版本資訊
- 版本號碼:15.0.4298.1
- 組建編號:15.0.4298.1
- 發行日期:2023 年 4 月 7 日
bcp 支援 Microsoft Entra 驗證,包括 Azure SQL Database 的多重要素驗證 (MFA) 支援、Microsoft Fabric 中的 SQL 資料庫,以及 Azure Synapse Analytics。
注意
Microsoft Entra ID 先前稱為 Azure Active Directory (Azure AD)。
系統需求
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 也提供sqlcmd 和 bcp。 如需詳細資訊,請參閱在 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
將資料匯入 (in
)時的目的地資料表名稱,以及從 SQL Server (out
) 匯出資料時的來源資料表名稱。
view_name
將資料複製到 SQL Server (in
) 時的目的地檢視表名稱,以及從 SQL Server(out
) 複製資料時的來源檢視表名稱。 只有所有資料行都參考相同資料表的檢視表,才能用來做為目的地檢視表。 如需將資料複製到檢視表之限制的詳細資訊,請參閱 INSERT。
"query"
傳回結果集的 Transact-SQL 查詢。 如果查詢傳回多個結果集,則只會將第一個結果集複製到資料檔案中,並會忽略接下來的結果集。 請利用雙引號括住查詢,利用單引號括住內嵌在查詢中的任何項目。 從查詢複製大量資料時也必須指定 queryout
。
只要在預存程序內參考的所有資料表在 bcp 陳述式執行之前就已存在,查詢就可以參考預存程序。 例如,如果預存程序產生暫存資料表,則 bcp 陳述式會失敗,這是因為暫存資料表只可在執行階段使用,而無法在陳述式執行階段使用。 在此種情況下,請考慮將預存程序的結果插入資料表中,然後使用 bcp 將資料表的資料複製到資料檔案。
in
從檔案複製到資料庫資料表或檢視表。 指定大量複製的方向。
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 可介於 4,096 位元組到 65,535 位元組;預設值是 4096
。
增加封包大小可以增強大量複製作業的效能。 如果要求較大的封包但無法為您授與該封包,便會使用預設值。 bcp 公用程式所產生的效能統計資料,會顯示所用的封包大小。
-b batch_size
指定每一批次匯入資料的資料列數。 每一批次會以個別交易的方式 (在認可之前匯入整個批次) 匯入及記錄。 根據預設,資料檔案中的所有資料列是以一個批次匯入。 若要在多個批次之間分散資料列,請指定小於資料檔案之資料列數目的 batch_size 。 如果有任何批次的交易失敗,只回復目前批次的插入項。 之後的失敗不會影響已認可的交易所匯入的批次。
請勿使用這個選項搭配 -h "ROWS_PER_BATCH=<bb>"
選項。
-c
利用字元資料類型來執行作業。 未必每個欄位都有這個選項的提示;它使用 char 作為儲存類型 (沒有前置詞)、欄位分隔符號是 \t
(定位字元),且資料列結束字元是 \r\n
(新行字元)。
-c
與 -w
不相容。
如需詳細資訊,請參閱使用字元格式匯入或匯出資料 (SQL Server)。
-C { ACP | OEM | RAW | code_page }
指定資料檔案中之資料的字碼頁。 只有當資料包含字元值大於 127 或小於 32 的code_page 、 code_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 的開頭是連字號 (-
) 或斜線 (/
),請勿在 -e
與 err_file 值之間加上空格。
-E
指定識別欄位要使用匯入之資料檔案中的一個或多個識別值。 如果未提供 -E
,就會略過匯入之資料檔案中此資料行的識別值,且 SQL Server 會根據建立資料表期間所指定的初始值與遞增值,自動指派唯一值。 如需詳細資訊,請參閱 DBCC CHECKIDENT。
如果資料檔案沒有資料表或檢視表中之識別欄位的值,請利用格式檔案指定,在匯入資料時,應該略過資料表或檢視表中的識別欄位;SQL Server 會自動指派資料行的唯一值。
-E
選項有特殊存取權限需求。 如需詳細資訊,請參閱本文後續章節「備註」。
-f format_file
指定格式檔的完整路徑。 這個選項的意義取決於使用它的環境,如下所示:
如果
-f
與format
選項一起使用,會為指定的資料表或檢視表建立指定的 format_file。 如果要建立 XML 格式檔案,請一併指定-x
選項。 如需詳細資訊,請參閱建立格式檔案 (SQL Server)。搭配
in
或out
選項一起使用時,-f
需要現有的格式檔案。注意
使用格式檔案,其中的
in
或out
選項為選擇性。 沒有-f
選項時,如果未指定-n
、-c
、-w
或-N
,命令會提示您輸入格式資訊,讓您將回覆儲存於格式檔案 (預設檔案名稱是bcp.fmt
)。
如果 format_file 的開頭是連字號 (-
) 或斜線 (/
),請勿在 -f
與 format_file 值之間加上空格。
-F first_row
指定要從資料表匯出或從資料檔案匯入之第一個資料列的號碼。 這個參數需要的值必須大於 (>
) 0、小於 (<
) 或等於 (=
) 資料列總數。 如果沒有這個參數,預設值是檔案中的第一個資料列。
first_row 可以是值高達 2^63-1 的正整數。
-F
first_row 以 1 為基礎。
-G
適用於:Azure SQL 資料庫、Microsoft Fabric 中的 SQL 資料庫,以及僅限 Azure Synapse Analytics。
用戶端會使用此參數來指定使用者以 Microsoft Entra 識別碼進行驗證。 -G 參數需要 14.0.3008.27 版或更新版本。 若要判斷您的版本,請執行 bcp -v
。 如需詳細資訊,請參閱在 Fabric 中使用 Microsoft Entra 驗證搭配 SQL 資料庫 或 Azure Synapse Analytics 或驗證至 SQL Database。
重要
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 使用者名稱和密碼認證匯出資料。 此範例會從
bcptest
Azure 伺服器的testdb
資料庫匯出aadserver.database.windows.net
資料表,並將資料儲存在c:\last\data1.dat
檔案中:bcp bcptest out "c:\last\data1.dat" -c -S aadserver.database.windows.net -d testdb -G -U alice@aadtest.onmicrosoft.com -P xxxxx
下列範例使用 Microsoft Entra 使用者的認證匯入資料。 這個範例使用 Microsoft Entra 使用者名稱和密碼,將資料從
c:\last\data1.dat
檔案匯入 Azure 伺服器bcptest
上testdb
資料庫的aadserver.database.windows.net
資料表:bcp bcptest in "c:\last\data1.dat" -c -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 認證,從邏輯伺服器
bcptest
上的testdb
資料庫匯出aadserver.database.windows.net
資料表,並將資料儲存於檔案c:\last\data2.dat
:bcp bcptest out "c:\last\data2.dat" -S aadserver.database.windows.net -d testdb -G -c
下列範例使用 Microsoft Entra 整合式驗證匯入資料。 這個範例使用與 Microsoft Entra ID 同盟的 Windows 認證,將資料從檔案資料表
c:\last\data2.dat
匯入bcptest
邏輯伺服器上testdb
資料庫的aadserver.database.windows.net
資料表:bcp bcptest in "c:\last\data2.dat" -S aadserver.database.windows.net -d testdb -G -c
Microsoft Entra 受控服務識別
重要
bcp 與驅動程式緊密結合。 使用 建立 DSN 的 bcp 和驅動程式的主要版本必須相同。 若要判斷您的版本,請執行
bcp -v
。在 Windows 上使用受控服務識別透過 bcp 匯出資料需要設定 DSN。
在執行 Windows 的電腦上設定 DSN:
- 在鍵盤上按 Windows 鍵 + R。
- 輸入
ODBC
並選取適當的 ODBC 資料來源管理員版本 - 選取 [使用者 DSN] 或 [系統 DSN] 索引標籤
- 選取 [新增] 並依照提示執行。
- 當系統要求驗證類型時,請選取 [Azure 受控服務識別驗證]
- 如果您有使用者指派的受控識別,請將身分識別的
Object (principal) ID
貼上到驗證索引標籤底部的 [登入識別碼] 方塊中 - 繼續遵循提示來設定 DSN
如需包含螢幕擷取畫面的完整逐步解說,請參閱 在UI中建立和編輯DSN。
設定 DSN 之後,
-D
,以指出傳遞-S
的值是 DSN。bcp bcptest out "c:\last\data1.dat" -c -D -S myDSN -d testdb
Microsoft Entra ID 存取權杖
bcp (17.8 和更新版本) 的使用者也可以使用權杖進行驗證。 下列範例使用 Linux 上的 PowerShell 來擷取存取權杖。
此範例會擷取存取權杖,並將其放入檔案中,以使用系統指派的受控識別導出資料。
Connect-AzAccount -Identity $access_token | cut -f 1 | tr -d '\n' | iconv -f ascii -t UTF-16LE > /tmp/tokenFile bcp bcptest out data2.dat -S aadserver.database.windows.net -d testdb -G -P /tmp/tokenFile -c
這個範例會將 傳遞
Client ID
至-AccountId
的Connect-AzAccount
參數,以擷取存取權杖,並將它放入權杖檔案中。 權杖接著會用來使用指定的使用者指派的受控識別來匯出資料。Connect-AzAccount -Identity -AccountId 'client_id_of_user_assigned_managed_identity' $access_token | cut -f 1 | tr -d '\n' | iconv -f ascii -t UTF-16LE > /tmp/tokenFile bcp bcptest out data2.dat -S aadserver.database.windows.net -d testdb -G -P /tmp/tokenFile -c
Microsoft Entra 互動式驗證
Microsoft Entra 互動式驗證適用於所有 Azure SQL 和 SQL Server 2022+,可讓您使用互動式對話方塊驗證,並且支援多重要素驗證。
Microsoft Entra 互動式驗證需要 bcp 15.0.1000.34 版或更新版本,以及 YODBC 17.2 版或更新版本。
若要啟用互動式驗證,請不要使用密碼,僅以使用者名稱 (
-G
) 提供-U
選項。下列範例使用 Microsoft Entra 互動式驗證匯出資料,其中包括指定 Microsoft Entra 帳戶的使用者名稱。
互動模式需要手動輸入密碼,或者若為啟用多重要素驗證的帳戶,則請完成您已設定的 MFA 驗證方法。
bcp bcptest out "c:\last\data1.dat" -c -S aadserver.database.windows.net -d testdb -G -U alice@aadtest.onmicrosoft.com
如果使用的 Microsoft Entra 使用者屬於同盟網域的 Microsoft 帳戶,則輸入命令列的使用者名稱必須包含其網域 (例如,
joe@contoso.com
):bcp bcptest out "c:\last\data1.dat" -c -S aadserver.database.windows.net -d testdb -G -U joe@contoso.com
如果來賓使用者存在於特定 Microsoft Entra 租用戶,且屬於 SQL Database 中具有執行 bcp 命令之資料庫權限的群組,則會使用其來賓使用者別名 (例如,
keith0@adventure-works.com
)。
-h "hints [, ... n]"
指定將資料大量匯入資料表或檢視表期間所使用的一或多個提示。
ORDER (column [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 現在會強制執行資料驗證與資料檢查,若針對資料檔案中無效的資料執行指令碼,則資料驗證與檢查作業可能會導致指令碼失敗。
注意
-m
max_errors 參數不適用於條件約束檢查。FIRE_TRIGGERS
利用 in 引數加以指定,任何定義於目的地資料表上的插入觸發程序,都會在大量複製作業期間執行。 如果未指定 FIRE_TRIGGERS,則不會執行任何插入觸發程序。
out
、queryout
與format
引數會略過 FIRE_TRIGGERS。
-i input_file
指定回應檔的名稱,該檔案包含利用互動模式 (未指定 -n
、-c
、-w
或 -N
) 執行大量複製時,對於命令提示字元中每個資料欄位問題的回覆。
如果 input_file 的開頭是連字號 (-
) 或斜線 (/
),請勿在 -i
與 input_file 值之間加空格。
-k
指定空白資料行在作業過程中應保持 Null 值,而非保有插入之資料行的任何預設值。 如需詳細資訊,請參閱大量匯入期間保留 Null 或預設值 (SQL Server)。
-K application_intent
宣告連接到伺服器時的應用程式工作負載類型。 唯一可能的值是 ReadOnly
。 如果未指定 -K
,則 bcp 公用程式不支援對 AlwaysOn 可用性群組中的次要複本進行連線。 如需詳細資訊,請參閱將唯讀工作負載卸載至 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
選項也不適用於轉換 money 或 bigint 資料類型。
-n
利用資料的原生 (資料庫) 資料類型來執行大量複製作業。 並非每個欄位都會出現這個選項的提示;它會使用原生值。
如需詳細資訊,請參閱使用原生格式匯入或是匯出資料 (SQL Server)。
-N
如果是非字元資料,請使用資料的原生 (資料庫) 資料類型執行大量複製作業;如果是字元資料,請使用 Unicode 字元執行大量複製作業。 這個選項為 -w
選項提供效能較高的替代方案,目的在於利用資料檔案,在 SQL Server 的執行個體之間轉移資料。 並非每個欄位都會出現這個提示。 如果您要轉移的資料包含 ANSI 擴充字元,而且您想利用原生模式的效能,請使用這個選項。
如需詳細資訊,請參閱使用 Unicode 原生格式匯入或匯出資料 (SQL Server)。
如果您要使用 bcp 搭配 -N
將該資料匯出再將匯入相同的資料表結構描述,若有固定長度的非 Unicode 字元資料行 (例如 char(10)),則可能會看到截斷警告。
可以忽略此警告。 解決這個警告的其中一種方式是使用 -n
取代 -N
。
-o output_file
指定接收來自命令提示字元重新導向之輸出的檔案名稱。
如果 output_file 的開頭是連字號 (-
) 或斜線 (/
),請勿在 -o
與 output_file 值之間加空格。
-P password
指定 登入識別碼的密碼。 如果未使用這個選項,bcp 命令會提示您輸入密碼。 如果在未使用密碼的情況下,於命令提示字元尾端使用此選項, bcp 就會使用預設密碼 (NULL)。
重要
請勿使用空白密碼。 請使用增強式密碼。
若要遮蓋密碼,請勿指定 -P
選項以及 -U
選項。 反之,請指定 bcp 以及 -U
選項和其他參數 (不指定 -P
),然後按 ENTER,該命令就會提示您輸入密碼。 這個方法可確保在輸入密碼時遮蓋密碼。
如果 password 的開頭是連字號 (-
) 或斜線 (/
),請勿在 -P
與 password值之間加空格。
-q
在 bcp 公用程式與 SQL Server 執行個體之間的連線中,執行 SET QUOTED_IDENTIFIER ON 陳述式。 請利用這個選項來指定包含空格或單引號的資料庫、擁有者、資料表或檢視表名稱。 請用引號 ("") 括住整個三部分資料表或檢視表名稱。
若要指定包含空格或單引號的資料庫名稱,您必須使用 -q
選項。
-q
不適用於傳遞給 -d
的值。
如需詳細資訊,請參閱本文後續的備註
-r row_term
指定資料列結束字元。 預設值是 \n (新行字元)。 請利用這個參數來覆寫預設的資料列結束字元。 如需詳細資訊,請參閱指定欄位與資料列結束字元 (SQL Server)。
如果在 bcp 命令使用十六進位表示法指定資料列結束字元,該值將會在 0x00
處截斷。 例如,指定 0x410041
時會使用 0x41
。
如果 row_term 的開頭是連字號 (-
) 或斜線 (/
),請勿在 -r
與 row_term 值之間加空格。
-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
處截斷。 例如,指定 0x410041
時會使用 0x41
。
如果 field_term 的開頭是連字號 (-
) 或斜線 (/
),請勿在 -t
與 field_term 值之間加空格。
-T
指定 bcp 公用程式使用整合式安全性的信任連線來連線至 SQL Server。 網路使用者的安全性認證、login_id 及 password 並非必要選項。 如果未指定 -T
,則必須指定 -U
與 -P
才能順利登入。
重要
bcp 公用程式使用整合式安全性以信任連線連線至 SQL Server 時,請使用 -T
選項 (信任連線),而非使用者名稱和密碼的組合。
bcp 公用程式連線到 SQL Database 或 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) and 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
這個選項搭配 format
與 -f
format_file 選項一起使用,會產生以 XML 為基礎的格式檔案,而非預設的非 XML 格式檔案。 匯入或匯出資料時,-x
無法運作。 如果沒有搭配 format
與 -f
format_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 功能套件個別下載。 選取
ENU\x64\MsSqlCmdLnUtils.msi
或ENU\x86\MsSqlCmdLnUtils.msi
。只有在同時安裝 SQL Server 工具和 SQL Server Native Client 時,才能支援 XML 格式檔案。
如需尋找 bcp 公用程式位置及其執行方式,以及命令提示字元公用程式語法慣例的相關資訊,請參閱 SQL 命令提示字元公用程式 (資料庫引擎)。
如需針對大量匯入或匯出作業準備資料的相關資訊,請參閱準備大量匯出或匯入的資料。
如需大量匯入所執行的資料列插入作業於何時記錄到交易記錄的相關資訊,請參閱大量匯入採用最低限度記錄的必要條件。
-
<
、>
、|
、&
與^
等字元為特殊的命令殼層字元,且在字串中使用這些字元時,必須在前方加上逸出字元 (^
) 或括在引號中 (例如"StringContaining&Symbol"
)。 如果您使用引號來括住包含特殊字元的字串,則引號會被視為環境變數值的一部分。
原生資料檔案支援
在 SQL Server 中,bcp 公用程式支援與從 SQL Server 2000 (8.x) 及更新版本開始的 SQL Server 版本相容的原生資料檔案。
計算資料行與時間戳記資料行
會忽略針對計算資料行或 timestamp 資料行匯入之資料檔案中的值,而且 SQL Server 會自動指派值。 如果資料檔案不包含資料表中計算資料行或 timestamp 資料行的值,請使用格式檔案指定,匯入資料時應略過資料表中的計算資料行或 timestamp 資料行;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 提示。
注意
停用條件約束是預設行為。 若要明確啟用條件約束,請搭配 CHECK_CONSTRAINTS 提示使用
-h
選項。存在觸發程序,而且未指定 FIRE_TRIGGER 提示。
注意
依預設不會引發觸發程序。 若要明確引發觸發程序,請搭配 FIRE_TRIGGERS 提示使用
-h
選項。您利用
-E
選項,從資料檔案匯入識別值。
注意
在 SQL Server 2005 (9.x) 中,目標資料表的 ALTER TABLE 權限是一項新的需求。 如果使用者帳戶沒有目標資料表的 ALTER 資料表權限,這項新需求可能造成不強制執行觸發程序和條件約束檢查的 bcp 指令碼失敗。
字元模式 (-c
) 與原生模式 (-n
) 最佳做法
本節有字元模式 (-c
) 與原生模式 (-n
) 的建議事項。
(管理員/使用者) 儘可能使用原生格式 (
-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 受控執行個體。 您可以從 WideWorldImporters
下載 https://github.com/Microsoft/sql-server-samples/releases/tag/wide-world-importers-v1.0 。 如需還原範例資料庫的語法,請參閱 RESTORE 陳述式。
範例測試條件
除非另有指定,否則範例假設您使用的是 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.log
和 Output_out.log
。
Error_out.log
應為空白。 比較 StockItemTransactions_character.bcp
和 StockItemTransactions_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.log
和Output_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. 指定字碼頁
下列節錄的程式碼範例示範,在指定字碼頁 65001 時的 bcp 匯入作業︰
bcp MyTable in "D:\data.csv" -T -c -C 65001 -t , ...
K. 使用自訂欄位和資料列結束字元的範例輸出檔案
這個範例示範的兩個範例檔案,是使用自訂欄位和資料列結束字元透過 bcp 所產生。
在
dbo.T1
資料庫建立有tempdb
和ID
這兩個資料行的資料表Name
。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
使用自訂欄位結束字元,從範例資料表
dbo.T1
產生輸出檔案。在這個範例,伺服器名稱為
MYSERVER
,而自訂欄位結束字元是由-t ,
指定。bcp dbo.T1 out T1.txt -T -S MYSERVER -d tempdb -w -t ,
結果集如下所示。
1,Natalia 2,Mark 3,Randolph
使用自訂欄位結束字元和自訂資料列結束字元,從範例資料表
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 的範例:
大量匯入或大量匯出的資料格式 (SQL Server)
匯入或匯出資料的格式檔案 (SQL Server)
考量與限制
- bcp 公用程式有一項限制,就是錯誤訊息只會顯示 512 個位元組字元。 只會顯示錯誤訊息的前 512 個位元組。
相關內容
- 為大量匯出或匯入準備資料
- BULK INSERT (Transact-SQL)
- OPENROWSET (Transact-SQL)
- SET QUOTED_IDENTIFIER (Transact-SQL)
- sp_configure (Transact-SQL)
- sp_tableoption (Transact-SQL)
- 要匯入和匯出資料的格式檔案 (SQL Server)
取得協助
- 對 SQL 的想法:有任何協助改善 SQL Server 的建議嗎?
- Microsoft Q & A (SQL Server)
- DBA Stack Exchange (標籤 sql-server):詢問 SQL Server 問題
- Stack Overflow (標籤 sql-server):SQL 開發問題的回答
- Reddit:有關 SQL Server 的一般討論
- Microsoft SQL Server 授權條款及資訊
- 適用於商務使用者的支援選項
- 其他 SQL Server 說明與意見反應
參與編輯 SQL 文件
您知道您可以自行編輯 SQL 內容嗎? 這樣做不僅可以協助改善文件,也能名列該頁面的參與者。
如需詳細資訊,請參閱如何參與 SQL Server 文件