適用於:SQL Server
Azure SQL Database
Azure SQL 受控實例
Microsoft Fabric 中的倉儲
在 SQL Server 中,以使用者指定的格式,將資料檔匯入資料庫數據表或檢視。
語法
BULK INSERT
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
FROM 'data_file'
[ WITH
(
[ [ , ] DATA_SOURCE = 'data_source_name' ]
-- text formatting options
[ [ , ] CODEPAGE = { 'RAW' | 'code_page' | 'ACP' | 'OEM' } ]
[ [ , ] DATAFILETYPE = { 'char' | 'widechar' | 'native' | 'widenative' } ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FORMAT = 'CSV' ]
[ [ , ] FIELDQUOTE = 'quote_characters' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] LASTROW = last_row ]
-- input file format options
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] FORMATFILE_DATA_SOURCE = 'data_source_name' ]
-- error handling options
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ERRORFILE = 'file_name' ]
[ [ , ] ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name' ]
-- database options
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] TABLOCK ]
-- source options
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ , ...n ] ) ]
[ [ , ] ROWS_PER_BATCH = rows_per_batch ]
[ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
[ [ , ] BATCHSIZE = batch_size ]
) ]
BULK INSERT
{ database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }
FROM 'data_file'
[ WITH
(
[ [ , ] DATA_SOURCE = 'data_source_name' ]
-- text formatting options
[ [ , ] CODEPAGE = { 'code_page' | 'ACP' } ]
[ [ , ] DATAFILETYPE = { 'char' | 'widechar' } ]
[ [ , ] ROWTERMINATOR = 'row_terminator' ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FORMAT = { 'CSV' | 'PARQUET' } ]
[ [ , ] FIELDQUOTE = 'quote_characters' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] LASTROW = last_row ]
-- input file format options
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] FORMATFILE_DATA_SOURCE = 'data_source_name' ]
-- error handling options
[ [ , ] MAXERRORS = max_errors ]
[ [ , ] ERRORFILE = 'file_name' ]
[ [ , ] ERRORFILE_DATA_SOURCE = 'errorfile_data_source_name' ]
) ]
引數
BULK INSERT 語句在不同的平臺上有不同的自變數和選項。 下表摘要說明差異:
| 特徵 | SQL Server | Azure SQL Database 和 Azure SQL 受控實例 | 網狀架構數據倉儲 |
|---|---|---|---|
| 數據源 | 本機路徑、網路路徑 (UNC) 或 Azure 記憶體 | Azure 儲存體 | Azure Storage,One Lake |
| 來源驗證 | Windows 驗證,SAS | Microsoft Entra ID、SAS 令牌、受控識別 | Microsoft Entra ID |
| 不支援的選項 |
* Path 中的萬用牌, FORMAT = 'PARQUET' |
* Path 中的萬用牌, FORMAT = 'PARQUET' |
DATAFILETYPE = {'native' | 'widenative'} |
| 啟用的選項,但沒有作用 |
KEEPIDENTITY、FIRE_TRIGGERS、CHECK_CONSTRAINTS、 TABLOCKORDERROWS_PER_BATCHKILOBYTES_PER_BATCH和BATCHSIZE不適用。 它們不會拋出語法錯誤,但沒有任何效果 |
database_name
指定的資料表或檢視表所在的資料庫名稱。 如果未指定,database_name 會是目前的資料庫。
schema_name
指定資料表或檢視表結構描述的名稱。 如果執行大量匯入作業之使用者的預設結構描述,是指定之資料表或檢視表的結構描述,則 schema_name 為選擇性。 如果未指定 schema,且執行大量匯入作業之使用者的預設結構描述與指定的資料表或檢視表不同,SQL Server 就會傳回錯誤訊息,且會取消大量匯入作業。
table_name
指定要大量匯入資料到其中之資料表或檢視表的名稱。 您只能使用所有資料行都參考相同基底資料表的檢視表。 如需將資料載入至視圖之限制的詳細資訊,請參閱 INSERT。
來自 'data_file'
指定含有要匯入至指定的資料表或檢視表中之資料的資料檔案完整路徑。
BULK INSERT 可以從磁碟或 Azure 儲存裝置(包括網路、軟碟、硬碟等)匯入資料。
BULK INSERT bing_covid_19_data
FROM 'C:\\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';
data_file 必須指定執行 SQL Server 之伺服器中的有效路徑。 如果 data_file 是一個遠端檔案,請指定「通用命名慣例」(UNC) 名稱。 UNC 名稱的格式為 \\SystemName\ShareName\Path\FileName。 例如:
BULK INSERT bing_covid_19_data
FROM '\\ShareX\bing_covid-19_data\public\curated\covid-19\latest\bing_covid-19_data.csv';
Azure SQL 資料庫和 Fabric Data Warehouse 支援從 URI 讀取資料,但不支援本地檔案路徑。
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv';
從 SQL Server 2017(14.x)開始, data_file 可以放在 Azure Storage。 在此情況下,您也必須指定 data_source_name 選項。 舉例來說,請參考 Azure 儲存裝置中的檔案匯入資料。
Fabric Data Warehouse 支援兩種不同的路徑樣式來指定來源路徑:
https://<storage account>.blob.core.windows.net/<container name>/<path to file>abfss://<container name>@<storage account>.dfs.core.windows.net/<path to file>
Fabric Data Warehouse 支援 * 可匹配 URI 中任意字元的萬用字元,並允許你為應匯入的檔案定義 URI 模式。 例如:
BULK INSERT bing_covid_19_data
FROM 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/*.csv';
注意
將取代 <data-lake>.blob.core.windows.net 為適當的 URL。
DATA_SOURCE
適用於:SQL Server 2017(14.x)及更新版本、Azure SQL 資料庫,以及 Microsoft Fabric 中的倉庫。
指定一個指定的外部資料來源,指向檔案匯入的 Azure Storage 根位置。
CREATE EXTERNAL DATA SOURCE pandemicdatalake
WITH (LOCATION = 'https://<data-lake>.blob.core.windows.net/public/');
注意
將取代 <data-lake>.blob.core.windows.net 為適當的 URL。
如需詳細資訊,請參閱 CREATE EXTERNAL DATA SOURCE。
子 FROM 句中的檔案路徑必須是相對路徑,且會附加在外部資料來源中定義的根位置。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, LASTROW = 100, FIELDTERMINATOR = ',');
注意
為簡化起見,以下範例使用相對路徑及預先定義的外部資料來源。
字碼頁
指定資料檔案中之資料的字碼頁。
CODEPAGE只有在資料包含字元值大於或小於 的 char、127 或32直欄時才相關。 如需範例,請參閱指定字碼頁。
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, CODEPAGE = '65001');
CODEPAGE 不是適用於 SQL Server 2017 (14.x) 的 Linux 上支援的選項。 針對 SQL Server 2019 (15.x),僅 'RAW' 允許 CODEPAGE選項 。
建議您在格式檔案中,針對每一個資料行各指定一個定序名稱。
CODEPAGE 值 |
描述 |
|---|---|
ACP |
將 char、varchar 或 text 資料類型的資料行,從 ANSI/Microsoft Windows 字碼頁 (ISO 1252) 轉換成 SQL Server 字碼頁。 |
OEM (預設值) |
char、varchar 或文字資料類型的資料行會從系統OEM字碼頁轉換為 SQL Server 字碼頁。 |
RAW |
不會將字碼頁轉換成另一種字碼頁。
RAW 是最快的選擇。 |
| code_page | 特定字碼頁編號,如 850。 SQL Server 2016 (13.x) 之前的版本不支援字碼頁 65001 (UTF-8 編碼) 。 |
CODEPAGE 值 |
描述 |
|---|---|
ACP |
將 char、varchar 或 text 資料類型的資料行,從 ANSI/Microsoft Windows 字碼頁 (ISO 1252) 轉換成 SQL Server 字碼頁。 |
| code_page | 特定字碼頁編號,如 850。 SQL Server 2016 (13.x) 之前的版本不支援字碼頁 65001 (UTF-8 編碼) 。 |
DATAFILETYPE
指定使用 BULK INSERT 指定的資料檔類型值來執行匯入作業。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2, DATAFILETYPE = 'char');
注意
將取代 <data-lake>.blob.core.windows.net 為適當的 URL。
DATAFILETYPE 值 |
所有資料都代表在 |
|---|---|
char (預設值) |
字元格式。 欲了解更多資訊,請參閱 使用字元格式匯入或匯出資料。 |
widechar |
Unicode 字元。 欲了解更多資訊,請參閱 使用 Unicode 字元格式來匯入或匯出資料。 |
native |
原生 (資料庫) 資料類型。 請利用 bcp 公用程式,從 SQL Server 大量匯入資料來建立原生資料檔案。 原生值提供了效能比 char 值更高的替代項。 在多個 SQL Server 執行個體之間,使用不包含任何擴充/雙位元組字集 (DBCS) 字元的資料檔大量傳送資料時,建議使用原生格式。 欲了解更多資訊,請參閱 使用原生格式匯入或匯出資料。 |
widenative |
原生 (資料庫) 資料類型,但在 char、varchar 及 text 資料行中除外,其中資料會儲存成 Unicode。 使用 widenative 公用程式從 SQL Server 大量匯入資料,以建立資料檔案。此 widenative 值提供 的更高品質替代方案 widechar。 如果資料檔包含 ANSI 延伸字元,請指定 widenative。欲了解更多資訊,請參閱 使用 Unicode 原生格式匯入或匯出資料。 |
DATAFILETYPE 值 |
所有資料都代表在 |
|---|---|
char (預設值) |
字元格式。 欲了解更多資訊,請參閱 使用字元格式匯入或匯出資料。 |
widechar |
Unicode 字元。 欲了解更多資訊,請參閱 使用 Unicode 字元格式來匯入或匯出資料。 |
MAXERRORS
指定取消大量匯入作業之前所允許的資料語法錯誤數目上限。 大量匯入作業所無法匯入的每個資料列都會被忽略,且會當作一項錯誤來計算。 如果未指定 max_errors,則預設為 10。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', MAXERRORS = 0);
這個 MAX_ERRORS 選項不適用於約束檢查或 貨幣和Bigint 資料型態的轉換。
錯誤檔案
指定用來收集格式錯誤且無法轉換成 OLE DB 資料列集之資料列的檔案。 這些資料列會「依照原狀」,從資料檔複製到這個錯誤檔中。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake',
ERRORFILE = 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/errors');
注意
將取代 <data-lake>.blob.core.windows.net 為適當的 URL。
當執行命令時,便會建立這個錯誤檔。 如果檔案已經存在,會發生一則錯誤。 此外,還會建立具有副檔名 .ERROR.txt 的控制檔,該檔案會參考錯誤檔中的每一列並提供錯誤診斷。 錯誤更正之後,就能夠載入資料。
從 SQL Server 2017(14.x)開始, error_file_path 可以放在 Azure 儲存空間。
錯誤檔案_資料來源
適用於:SQL Server 2017 (14.x) 和更新版本。
指定一個命名的外部資料來源,指向錯誤檔案的 Azure 儲存裝置位置,以追蹤匯入過程中發現的錯誤。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (
DATA_SOURCE = 'pandemicdatalake',
ERRORFILE = 'curated/covid-19/bing_covid-19_data/latest/errors',
ERRORFILE_DATA_SOURCE = 'pandemicdatalake'
);
欲了解更多建立外部資料來源的細節,請參見 「建立外部資料來源」。
第一排
指定要載入之第一個資料列的號碼。 預設值是指定之資料檔案中的第一個資料列。
FIRSTROW 是以1為基礎。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIRSTROW = 2);
此 FIRSTROW 屬性並非要略過欄標頭。 陳述 BULK INSERT 式不支援略過標頭。 如果您選擇跳過資料列,SQL Server 資料庫引擎只會查看欄位結束字元,而且不會驗證跳過資料列欄位中的資料。
拉斯特羅
指定要載入之最後一個資料列的號碼。 預設值是 0,表示指定之資料檔案中的最後一個資料列。
批次大小
指定批次中的資料列數。 每個批次都會當做一筆交易複製到伺服器中。 如果失敗,SQL Server 會認可或復原每個批次的交易。 依預設,指定之資料檔中的所有資料都是單一批次。 如需有關效能考量的詳細資訊,請參閱本文稍後的效能考量。
檢查約束條件
指定在大量匯入作業期間,必須檢查目標資料表或檢視表的所有條件約束。 如果沒有 CHECK_CONSTRAINTS 選項,則會忽略任何 CHECK 和 FOREIGN KEY 限制,並在作業之後,表格上的限制會標示為不受信任。
UNIQUE 並且 PRIMARY KEY 始終強制執行約束。 匯入至以條件約束定義 NOT NULL 的字元欄時,當文字檔中沒有值時, BULK INSERT 會插入空白字串。
在某個點上,您必須檢查整份資料表的條件約束。 如果資料表在大量匯入作業之前是非空的,則重新驗證限制的成本可能會超過將限制套用 CHECK 至增量資料的成本。
如果輸入資料包含違反條件約束的資料列,您可能會想停用條件約束 (預設行為)。 停用限制後 CHECK ,您可以匯入資料,然後使用 Transact-SQL 陳述式來移除無效的資料。
注意
此 MAXERRORS 選項不適用於條件約束檢查。
火災觸發器
指定在大量匯入作業期間,執行目的地資料表上所定義的任何插入觸發程序。 如果針對目標資料表上的作業定義 INSERT 觸發程序,則會針對每個已完成的批次觸發觸發程序。
如果未指定,則 FIRE_TRIGGERS 不會執行任何插入觸發程式。
保持身份
指定識別欄位要使用匯入之資料檔案中的一個或多個識別值。 如果未指定,則 KEEPIDENTITY 會驗證此資料行的身分識別值,但不會匯入,而且 SQL Server 會根據資料表建立期間指定的種子和遞增值自動指派唯一值。 如果資料檔案中沒有資料表或檢視表中之識別欄位的值,請利用格式檔來指定,在匯入資料時略過資料表或檢視表中的識別欄位;SQL Server 會自動指派資料行的唯一值。 如需詳細資訊,請參閱 DBCC CHECKIDENT。
欲了解更多資訊,請參閱「 批量匯入資料時保留身份值」的說明。
KEEPNULLS
指定在大量匯入作業期間,空白資料行應該保留 Null 值,而不是插入資料行的任何預設值。 更多資訊請參閱 「保留空值」或「批量匯入時的預設值」。
KILOBYTES_PER_BATCH
以 kilobytes_per_batch 指定每一批資料的大約 KB 數。
KILOBYTES_PER_BATCH預設為未知。 如需有關效能考量的詳細資訊,請參閱本文稍後的效能考量。
訂單
指定如何排序資料檔案中的資料。 如果匯入資料時是依照資料表的叢集索引來排序,將可提升大量匯入的效能。 如果數據檔依叢集索引鍵的順序排序,或數據表上沒有叢集索引,則會忽略 ORDER 子句。 提供的資料行名稱必須是目的地資料表中的有效資料行名稱。 依預設,大量插入作業會假設資料檔案沒有排序。 為了達到最佳的大量匯入效果,SQL Server 也會驗證匯入的資料是否已排序。
n 是一個預留位置,表示可以指定多個資料行。
ROWS_PER_BATCH
指出資料檔案中大約有多少資料列。
依預設,資料檔案中的所有資料都會當做單一交易來傳給伺服器,而且查詢最佳化工具並不知道批次中的資料列數。 如果您指定 ROWS_PER_BATCH (值 > 為 0) ,則伺服器會使用此值來最佳化大量匯入作業。 指定的 ROWS_PER_BATCH 值應該與實際列數大致相同。 如需有關效能考量的詳細資訊,請參閱本文稍後的效能考量。
TABLOCK
指定在大量匯入作業期間,取得資料表層級鎖定。 如果表格沒有索引且 TABLOCK 已指定,則多個用戶端可以同時載入表格。 根據預設,鎖定行為是由資料表選項 table lock on bulk load所決定。 在大量匯入作業期間保留鎖定,會減少競爭資料表鎖定的情況,在某些情況下,可以大幅提升效能。 如需有關效能考量的詳細資訊,請參閱本文稍後的效能考量。
資料行存放區索引的鎖定行為不同,因為其是在內部分成多個資料列集。 每個執行緒都會在資料列集上採用獨佔 (X) 鎖定,以允許使用並行資料載入會話平行載入資料,將資料獨佔載入到每個資料列集中。 使用 TABLOCK option 會導致執行緒在資料表上取得獨佔鎖定 (與傳統資料列集的大量更新 (BU) 鎖定不同,這會防止其他並行執行緒同時載入資料。
輸入檔案格式選項
FORMAT
適用於:SQL Server 2017 (14.x) 和更新版本。
指定符合 RFC 4180 標準的逗號分隔值檔案。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FORMAT = 'CSV');
在 Fabric Data Warehouse 中,該 BULK INSERT 語句支援與 COPY INTO 語句相同的格式,因此 FORMAT = 'PARQUET' 也被支援。
現場引用
適用於:SQL Server 2017 (14.x) 和更新版本。
指定要在 CSV 檔案中用作引號字元的字元。 如果未指定,則會使用引號字元 (") 作為引號字元,如 RFC 4180 標準中所定義。
格式檔案
指定格式檔的完整路徑。 格式檔描述包含預存回應的資料檔案,這些預存回應是利用 bcp 公用程式在相同資料表或檢視表上建立的。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake',
FORMATFILE = 'https://<data-lake>.blob.core.windows.net/public/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt');
注意
將取代 <data-lake>.blob.core.windows.net 為適當的 URL。
在下列情況下,應該使用格式檔:
- 資料檔案包含比資料表或檢視表更多或更少的資料行。
- 資料行的順序不同。
- 資料行分隔符號不同。
- 資料格式有其他變更。 格式檔通常是利用 bcp 公用程式來建立的,您可以視需要利用文字編輯器來修改它。 欲了解更多資訊,請參閱 bcp 工具 及 建立格式檔與 bcp 的連結。
從 SQL Server 2017(14.x)開始,在 Azure SQL Database 中, format_file_path 可以存放在 Azure Storage。
FORMATFILE_DATA_SOURCE
適用於:SQL Server 2017 (14.x) 和更新版本。
指定一個命名的外部資料來源,指向格式檔的 Azure Storage 位置,以定義匯入資料的結構。
BULK INSERT bing_covid_19_data
FROM 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (
DATA_SOURCE = 'pandemicdatalake',
FORMATFILE = 'curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.fmt',
FORMATFILE_DATA_SOURCE = 'pandemicdatalake'
);
FIELDTERMINATOR
指定用於 char 欄位終端器的欄位終端器及 widechar 資料檔案。 預設欄位結束字元是 \t (定位字元)。 如需詳細資訊,請參閱 指定字段和數據列終止符。
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', FIELDTERMINATOR = ',', FIRSTROW = 2);
行終結者
指定用於charwidechar資料檔案的列終止符。
BULK INSERT bing_covid_19_data
FROM '/curated/covid-19/bing_covid-19_data/latest/bing_covid-19_data.csv'
WITH (DATA_SOURCE = 'pandemicdatalake', ROWTERMINATOR = '\r\n', FIRSTROW = 2);
預設的列終止符為 \r\n (回車與換行字元)。 如需詳細資訊,請參閱 指定字段和數據列終止符。
相容性
BULK INSERT 對從檔案讀取的資料強制執行嚴格的資料驗證和資料檢查,這可能會導致現有指令碼在無效資料上執行時失敗。 例如, BULK INSERT 驗證:
- float 或 real 資料類型的原生表示法是否有效。
- Unicode 資料的長度是否為偶數位元組。
資料類型
字串到十進位資料類型轉換
中使用的 BULK INSERT 字串到十進位資料類型轉換遵循與 Transact-SQL CONVERT 函數相同的規則,該函數拒絕代表使用科學記數法的數值的字串。 因此,會 BULK INSERT 將這類字串視為無效值,並報告轉換錯誤。
若要因應這種行為,請使用格式檔案,將科學記號標記法 float 資料大量匯入至十進位資料行。 在格式檔案中,請將此資料行明確描述為 real 或 float 資料。 如需這些資料類型的詳細資訊,請參閱 float 和 real。
格式檔案會以 SQLFLT4 資料類型來表示 real 資料,並以 SQLFLT8 資料類型來表示 float 資料。 關於非 XML 格式檔案的資訊,請參閱 使用 bcp 指定檔案儲存類型。
匯入使用科學記號標記法之數值的範例
此範例會在 bulktest 資料庫中使用下表:
CREATE TABLE dbo.t_float
(
c1 FLOAT,
c2 DECIMAL (5, 4)
);
使用者想要將大量資料匯入 t_float 資料表中。 資料檔 C:\t_float-c.dat,包含科學記數法 浮點 資料,例如:
8.0000000000000002E-2 8.0000000000000002E-2
複製此範本時,請注意會將定位字元 (\t) 儲存為空格的不同文字編輯器和編碼。 本範本稍後會出現定位字元。
不過, BULK INSERT 無法將此資料直接 t_float匯入 ,因為它的第二個資料行 c2,會使用 十進位資料 類型。 因此,格式檔案是必要的。 格式檔案必須將科學記號標記法 float 資料對應到資料行 c2 的十進位格式。
下列格式檔案使用 SQLFLT8 資料類型,將第二個資料欄位對應至第二個資料欄:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="30" />
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="30" />
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="c1" xsi:type="SQLFLT8" />
<COLUMN SOURCE="2" NAME="c2" xsi:type="SQLFLT8" />
</ROW>
</BCPFORMAT>
若要使用此格式檔案 (使用檔案名稱 C:\t_floatformat-c-xml.xml) 將測試資料匯入測試資料表,請發出下列 Transact-SQL 陳述式:
BULK INSERT bulktest.dbo.t_float
FROM 'C:\t_float-c.dat'
WITH (FORMATFILE = 'C:\t_floatformat-c-xml.xml');
重要
Azure SQL 資料庫與 Fabric Data Warehouse 僅支援從 URI 讀取(例如 Azure Storage)。
大量匯出或匯入 SQLXML 文件的資料類型
若要大量匯出或匯入 SQLXML 資料,請在格式檔案中使用下列其中一種資料類型:
| 資料類型 | 效果 |
|---|---|
| SQLCHAR 或 SQLVARCHAR | 資料是使用用戶端字碼頁或定序所隱含的字碼頁所傳送。 效果與指定 DATAFILETYPE = 'char' 而不指定格式檔案相同。 |
| SQLNCHAR 或 SQLNVARCHAR | 以 Unicode 格式傳送這份資料。 效果與指定 DATAFILETYPE = 'widechar' 而不指定格式檔案相同。 |
| SQLBINARY 或 SQLVARBIN | 未經任何轉換即傳送這份資料。 |
備註
關於語句、BULK INSERT語句與INSERT ... SELECT * FROM OPENROWSET(BULK...)指令的比較bcp,請參見「資料的批量匯入與匯出」。
如需有關準備大量匯入資料的資訊,請參閱準備大量 匯出或匯入的資料。
該 BULK INSERT 語句可以在使用者定義的交易中執行,以將資料匯入到表格或視圖中。 或者,若要使用多個相符專案來大量匯入資料,交易可以在陳述式中BATCHSIZE指定BULK INSERT子句。 如果復原多批次交易,則會復原交易傳送至 SQL Server 的每個批次。
互通性
從 CSV 檔案匯入資料
從 SQL Server 2017 (14.x) 開始, BULK INSERT 支援 CSV 格式,Azure SQL 資料庫也是如此。
SQL Server 2017 (14.x) 之前,大量匯入作業不支援逗號分隔值 (CSV) 檔案。 不過,在某些情況下,CSV 檔案可用以當做資料檔,以便將資料大量匯入 SQL Server。 如需從 CSV 資料檔案匯入資料需求的相關資訊,請參閱 準備大量匯出或匯入的資料。
記錄行為
如需大量匯入 SQL Server 所執行的資料列插入作業何時記錄在交易記錄中的資訊,請參閱 大量匯入中最小記錄的必要條件。 Azure SQL Database 不支援最低限度記錄。
局限性
將格式檔案與 BULK INSERT一起使用時,您最多只能指定 1,024 個欄位。 這與資料表中允許的資料行數目上限相同。 如果您將格式檔案 BULK INSERT 與包含超過 1,024 個欄位的資料檔案搭配使用, BULK INSERT 則會產生 4822 錯誤。
bcp 公用程式沒有此限制,因此對於包含超過 1,024 個欄位的資料檔,請使用BULK INSERT不帶格式檔案或使用 bcp 命令。
效能考量
如果要在單一批次中排清的頁數超出內部臨界值,可能會發生緩衝集區的完整掃描,以識別批次認可時要排清的頁面。 這個完整掃描可能會損及大量匯入效能。 當大型緩衝集區與緩慢的 I/O 子系統結合時,可能會超出內部臨界值。 若要避免大型電腦上的緩衝區溢位,請不要使用 TABLOCK 提示 (這會移除大量最佳化) 或使用較小的批次大小 (會保留大量最佳化)。
建議您利用您的資料負荷量測試各種批次大小來找出最適合您的狀況。 請記住,批次大小具有部分復原隱含。 如果您的處理程序失敗,且在再次使用 BULK INSERT 之前,您可能必須執行額外的手動工作,以移除在失敗發生之前順利插入的部分列。
使用 Azure SQL 資料庫時,如果您要匯入大量資料,請考慮在匯入之前暫時提高資料庫或執行個體的效能層級。
安全性
安全性帳戶委派 (模擬)
如果使用者使用 SQL Server 登入,則會使用 SQL Server 處理序帳戶的安全性設定檔。 使用 SQL Server 驗證的登入無法於資料庫引擎外部進行驗證。 因此,當使用 SQL Server 驗證登入起始命令時 BULK INSERT ,會使用 SQL Server 進程帳戶的安全性內容 (SQL Server 資料庫引擎服務所使用的帳戶) 來建立與資料的連線。
若要成功讀取來源資料,您必須授與 SQL Server 資料庫引擎所使用的帳戶來源資料的存取權。 相反地,如果 SQL Server 使用者是使用 Windows 驗證登入,則該使用者只能讀取其使用者帳戶可存取的檔案,而與 SQL Server 處理序的安全性設定檔無關。
使用 BULK INSERT 或 osql 執行陳述式時,從一部電腦、將資料插入第二部電腦上的 SQL Server,以及使用 UNC 路徑在第三部電腦上指定data_file,您可能會收到 4861 錯誤。
若要解決這個錯誤,請使用 SQL Server 驗證,並指定一個使用 SQL Server 處理序帳戶之安全性設定檔的 SQL Server 登入,或設定 Windows 來啟用安全性帳戶委派。 如需有關如何使某個使用者帳戶受到信任而委派的詳細資訊,請參閱 Windows 說明。
如需此專案和其他安全性 BULK INSERT考量的詳細資訊,請參閱 使用 BULK INSERT 或 OPENROWSET(BULK...) 將資料匯入 SQL Server。
當從 Azure Storage 匯入且資料不是公開(匿名存取)時,請建立一個基於 SAS 金鑰並用資料庫主金鑰(DMK)加密的資料庫範圍憑證,然後建立一個外部資料庫來源用於你的BULK INSERT指令。
或者,也可根據 建立 MANAGED IDENTITY 以授權非公用儲存體帳戶中資料存取的要求。 使用 MANAGED IDENTITY時,Azure Storage 必須透過新增 Storage Blob Data Contributor 內建的 Azure 角色基礎存取控制(RBAC)角色,授予實例的管理身份權限,該角色提供對管理身份的讀寫權限,以支援必要的 Azure Storage 容器。 Azure SQL 受控執行個體等服務具有系統指派的受控識別,並且可以有一個或多個使用者指派的受控識別。 您可以使用系統指派的受控識別或使用者指派的受控識別來授權要求。 針對授權, default 將會使用受控執行個體的身分識別 (也就是主要使用者指派的受控識別,如果未指定使用者指派的受控識別,則使用系統指派的受控識別)。 舉例來說,請參考 Azure 儲存裝置中的檔案匯入資料。
重要
管理身份適用於 Azure SQL,以及 SQL Server 2025(17.x)及更新版本。
權限
下列許可權適用於大量匯入資料的位置 (目標)。
需求 INSERT 和 ADMINISTER BULK OPERATIONS 權限。 在 Azure SQL 資料庫中, INSERT 需要 ADMINISTER DATABASE BULK OPERATIONS 許可權。
ADMINISTER BULK OPERATIONS 權限或 大量管理員 角色不支援 Linux 上的 SQL Server。 只有 sysadmin 可以針對 Linux 上的 SQL Server 執行大量插入。
此外, ALTER TABLE 如果下列一或多個條件成立,則需要許可:
條件約束存在,但
CHECK_CONSTRAINTS未指定選項。停用條件約束是預設行為。 若要明確檢查限制,請使用 選項
CHECK_CONSTRAINTS。觸發程式存在,但
FIRE_TRIGGER未指定選項。依預設不會引發觸發程序。 若要明確觸發觸發程式,請使用選項
FIRE_TRIGGER。您可以使用此
KEEPIDENTITY選項從資料檔匯入身分值。
範例
本文中的程式代碼範例會使用 AdventureWorks2025 或 AdventureWorksDW2025 範例資料庫,您可以從 Microsoft SQL Server 範例和社群專案 首頁下載。
重要
Azure SQL 資料庫和 Fabric Warehouse 只支援從 Azure Storage 讀取資料。
A。 使用管道來匯入檔案資料
下列範例利用垂直線 (AdventureWorks2022.Sales.SalesOrderDetail) 做為欄位結束字元,並利用 | 做為資料列結束字元,從指定的資料檔中,將訂單詳細資訊匯入 |\n 資料表中。
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ' |\n');
B. 使用 FIRE_TRIGGERS 引數
下列範例指定 FIRE_TRIGGERS 引數。
BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM 'f:\orders\lineitem.tbl'
WITH (FIELDTERMINATOR = ' |', ROWTERMINATOR = ':\n', FIRE_TRIGGERS);
C. 利用換行字元作為資料列結束字元
下列範例利用換行字元做為資料列結束字元來匯入檔案,如 UNIX 輸出:
DECLARE @bulk_cmd AS VARCHAR (1000);
SET @bulk_cmd = 'BULK INSERT AdventureWorks2022.Sales.SalesOrderDetail
FROM ''<drive>:\<path>\<filename>''
WITH (ROWTERMINATOR = ''' + CHAR(10) + ''')';
EXECUTE (@bulk_cmd);
注意
在 Windows 上, \n 會自動取代為 \r\n。
D. 指定字碼頁
下列範例說明如何指定字碼頁。
BULK INSERT MyTable
FROM 'D:\data.csv'
WITH (CODEPAGE = '65001', DATAFILETYPE = 'char', FIELDTERMINATOR = ',');
E. 從 CSV 檔案匯入資料
下列範例示範如何指定 CSV 檔案,跳過標頭 (第一個資料列),使用 ; 作為欄位結束字元,以及使用 0x0a 作為行結束字元:
BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
FORMAT = 'CSV',
FIRSTROW = 2,
FIELDQUOTE = '\',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '0x0a'
);
下列範例示範如何以 UTF-8 格式 (使用 CODEPAGE 的 65001) 指定 CSV 檔案,跳過標頭 (第一個資料列),使用 ; 作為欄位結束字元,以及使用 0x0a 作為行結束字元:
BULK INSERT Sales.Invoices
FROM '\\share\invoices\inv-2016-07-25.csv'
WITH (
CODEPAGE = '65001',
FORMAT = 'CSV',
FIRSTROW = 2,
FIELDQUOTE = '\',
FIELDTERMINATOR = ';',
ROWTERMINATOR = '0x0a'
);
F. 從 Azure Storage 中的檔案匯入資料
從 Azure Storage 中的 CSV 載入資料,並使用 SAS 令牌
以下範例展示了如何從你已建立共享存取簽章(SAS)的 Azure 儲存位置的 CSV 檔案載入資料。 Azure 儲存位置被設定為外部資料來源,這需要資料庫範圍驗證憑證,使用 SAS 金鑰,並在使用者資料庫中用 DMK 加密。
注意
確保你在 SAS 標記中沒有前導 ? ,且至少對應該載入 srt=o&sp=r的物件有讀取權限,且有效期是有效的(所有日期均為 UTC 時間)。
(可選)如果不需要 a DATABASE SCOPED CREDENTIAL ,就不需要 DMK,因為 blob 是設定為公開(匿名)存取。
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
(可選)不需要 A DATABASE SCOPED CREDENTIAL 是因為 blob 是設定為公開(匿名)存取。
不要在 SAS 標記中包含前導 ? 。 請確保你至少對應該載入srt=o&sp=r的物件有讀取權限(),且有效期是有效的(所有日期均為UTC時間)。
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '******srt = sco&sp = rwac&se = 2017-02-01T00:55:34Z&st = 2016-12-29T16:55:34Z***************';
注意
CREDENTIAL 如果 blob 是設定為公開(匿名)存取,則不需要。
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices',
CREDENTIAL = MyAzureBlobStorageCredential
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
從 Azure Storage 中的 CSV 載入資料,並使用管理身份
以下範例展示了如何使用 BULK INSERT Azure 儲存裝置中 Managed Identity 從 CSV 檔案載入資料的指令。 Azure 儲存裝置的位置被設定為外部資料來源。
(可選)如果不需要 a DATABASE SCOPED CREDENTIAL ,就不需要 DMK,因為 blob 是設定為公開(匿名)存取。
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
(可選)不需要 A DATABASE SCOPED CREDENTIAL ,因為 blob 是為公開(匿名)存取而設定:
CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential
WITH IDENTITY = 'Managed Identity';
授予 Storage Blob Data Contributor 角色,提供對 Azure Storage 容器的管理身份的讀寫存取。
注意
CREDENTIAL 如果 blob 是設定為公開(匿名)存取,則不需要。
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://****************.blob.core.windows.net/invoices',
CREDENTIAL = MyAzureBlobStorageCredential
);
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (DATA_SOURCE = 'MyAzureBlobStorage');
重要
管理身份適用於 SQL Server 2025(17.x)及更新版本,以及 Azure SQL。
G. 從 Azure 儲存裝置中的檔案匯入資料並指定錯誤檔案
以下範例說明如何從 Azure 儲存裝置中的 CSV 檔案載入資料,該檔案設定為外部資料來源,並指定錯誤檔案。 您需要使用共用存取簽章的資料庫範圍認證。 若在 Azure SQL 資料庫上執行, ERRORFILE 選項應附帶 ERRORFILE_DATA_SOURCE,否則匯入可能會因權限錯誤而失敗。 中 ERRORFILE 指定的檔案不應存在於容器中。
BULK INSERT Sales.Invoices
FROM 'inv-2017-12-08.csv'
WITH (
DATA_SOURCE = 'MyAzureInvoices',
FORMAT = 'CSV',
ERRORFILE = 'MyErrorFile',
ERRORFILE_DATA_SOURCE = 'MyAzureInvoices'
);
完整 BULK INSERT 範例包括設定憑證與外部資料來源,請參閱 Azure 儲存中資料的批量存取範例。
更多範例
下列文章提供了其他 BULK INSERT 範例:
- XML 文件批量匯入與匯出的範例
- 大量匯入資料時要保留身份值
- 批量匯入時保留空值或預設值
- 指定欄位與列終端
- 使用格式檔來批量匯入資料
- 使用字元格式來匯入或匯出資料
- 使用原生格式匯入或匯出資料
- 使用 Unicode 字元格式來匯入或匯出資料
- 使用 Unicode 原生格式來匯入或匯出資料
- 使用格式檔跳過表格欄位
- 使用格式檔將表格欄位映射到資料檔案欄位