Bulk Insert命令具體
BULK INSERT以使用者指定的格式複製一個資料檔案至資料庫表或檢視中。
語法:
- BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_name' FROM 'data_file' }
- WITH (
- [ BATCHSIZE [ = batch_size ] ],
- [ CHECK_CONSTRAINTS ],
- [ CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ] ],
- [ DATAFILETYPE [ = 'char' | 'native'| 'widechar' | 'widenative' ] ],
- [ FIELDTERMINATOR [ = 'field_terminator' ] ],
- [ FIRSTROW [ = first_row ] ],
- [ FIRE_TRIGGERS ],
- [ FORMATFILE = 'format_file_path' ],
- [ KEEPIDENTITY ],
- [ KEEPNULLS ],
- [ KILOBYTES_PER_BATCH [ = kilobytes_per_batch ] ],
- [ LASTROW [ = last_row ] ],
- [ MAXERRORS [ = max_errors ] ],
- [ ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ],
- [ ROWS_PER_BATCH [ = rows_per_batch ] ],
- [ ROWTERMINATOR [ = 'row_terminator' ] ],
- [ TABLOCK ],
- )
BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_name' FROM 'data_file' } WITH ( [ BATCHSIZE [ = batch_size ] ], [ CHECK_CONSTRAINTS ], [ CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ] ], [ DATAFILETYPE [ = 'char' | 'native'| 'widechar' | 'widenative' ] ], [ FIELDTERMINATOR [ = 'field_terminator' ] ], [ FIRSTROW [ = first_row ] ], [ FIRE_TRIGGERS ], [ FORMATFILE = 'format_file_path' ], [ KEEPIDENTITY ], [ KEEPNULLS ], [ KILOBYTES_PER_BATCH [ = kilobytes_per_batch ] ], [ LASTROW [ = last_row ] ], [ MAXERRORS [ = max_errors ] ], [ ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ], [ ROWS_PER_BATCH [ = rows_per_batch ] ], [ ROWTERMINATOR [ = 'row_terminator' ] ], [ TABLOCK ], )
引數:
'database_name'
是包括指定表或檢視的資料庫的名稱。假設未指定,則系統默覺得當前資料庫。
'owner'
是表或檢視全部者的名稱。當執行大容量複製操作的使用者擁有指定的表或檢視時,owner 是可選項。假設沒有指定 owner 而且執行大容量複製操作的使用者不擁有指定的表或檢視,則 Microsoft® SQL Server? 將返回錯誤資訊並取消大容量複製操作。
'table_name'
是大容量複製資料於當中的表或檢視的名稱。僅僅能使用那些全部的列引用同樣基表所在的檢視。有關向檢視中複製資料的限制的很多其它資訊,請參見 INSERT。
'data_file'
是資料檔案的完整路徑,該資料檔案包括要拷貝到指定表或檢視的資料。BULK INSERT 從磁碟複製資料(包括網路、軟盤、硬碟等)。 data_file 必須從執行 SQL Server 的server指定有效路徑。假設 data_file 是遠端檔案,則請指定通用命名規則 (UNC) 名稱。
BATCHSIZE [ = batch_size ]
指定批處理中的行數。每一個批處理作為一個事務複製至server。SQL Server提交或回滾(在失敗時)每一個批處理的事務。預設情況下,指定資料檔案裡的全部資料是一個批處理。
CHECK_CONSTRAINTS
指定在大容量複製操作中檢查 table_name 的不論什麼約束。預設情況下,將會忽略約束。
CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ]
指定該資料檔案裡資料的內碼表。僅當資料含有字元值大於 127 或小於 32 的 char、varchar 或 text 列時,CODEPAGE 才是適用的。CODEPAGE 值 描寫敘述 ACP char、varchar 或 text 資料型別的列從 ANSI/Microsoft Windows® 內碼表 ISO 1252 轉換為 SQL Server 內碼表。 OEM(預設值) char、varchar 或 text 資料型別的列被從系統 OEM 內碼表轉換為 SQL Server 內碼表。 RAW 並不進行從一個內碼表到還有一個內碼表的轉換;這是最快的選項。 code_page 特定的內碼表號碼,比如 850。
DATAFILETYPE [ = {'char' | 'native' | 'widechar' | 'widenative' } ]
指定 BULK INSERT 使用指定的預設值執行復制操作。DATAFILETYPE 值 描寫敘述 char(預設值) 從含有字元資料的資料檔案執行大容量複製操作。 native 使用 native(資料庫)資料型別執行大容量複製操作。要裝載的資料檔案由大容量複製資料建立,該複製是用 bcp 有用工具從 SQL Server 進行的。 widechar 從含有 Unicode 字元的資料檔案裡執行大容量複製操作。 widenative 執行與 native 同樣的大容量複製操作,不同之處是 char、varchar 和 text 列在資料檔案裡儲存為 Unicode。要裝載的資料檔案由大容量複製資料建立,該複製是用 bcp 有用工具從 SQL Server 進行的。該選項是對 widechar 選項的一個更高效能的替代,而且它用於使用資料檔案從一個執行 SQL Server 的計算機向還有一個計算機傳送資料。當傳送含有 ANSI 擴充套件字元的資料時,使用該選項以便利用 native 模式的效能。
FIELDTERMINATOR [ = 'field_terminator' ]
指定用於 char 和 widechar 資料檔案的欄位終止符。預設的欄位終止符是 /t(製表符)。
FIRSTROW [ = first_row ]
指定要複製的第一行的行號。預設值是 1,表示在指定資料檔案的第一行。
FIRE_TRIGGERS
指定目的表中定義的不論什麼插入觸發器將在大容量複製操作過程中執行。假設沒有指定 FIRE_TRIGGERS,將不執行不論什麼插入觸發器。
FORMATFILE [ = 'format_file_path' ]
指定一個格式檔案的完整路徑。格式檔案描寫敘述了含有儲存響應的資料檔案,這些儲存響應是使用 bcp 有用工具在同樣的表或檢視中建立的。格式檔案應該用於下面情況: 資料檔案含有比表或檢視很多其它或更少的列。列使用不同的順序。列切割符發生變化。資料格式有其它的改變。通常,格式檔案通過 bcp 有用工具建立而且依據須要用文字編輯器改動。有關很多其它資訊,請參見 bcp 有用工具。
KEEPIDENTITY
指定標識列的值存在於匯入檔案裡。假設沒有指定 KEEPIDENTITY,在匯入的資料檔案裡此列的標識值將被忽略,而且 SQL Server 將依據表建立時指定的種子值和增量值自己主動賦給一個唯一的值。假如資料檔案不含該表或檢視中的標識列,使用一個格式檔案來指定在匯入資料時,表或檢視中的標識列應被忽略;SQL Server 自己主動為此列賦予唯一的值。有關具體資訊,請參見 DBCC CHECKIDENT。
KEEPNULLS
指定在大容量複製操作中空列應保留一個空值,而不是對插入的列賦予預設值。
KILOBYTES_PER_BATCH [ = kilobytes_per_batch ]
指定每一個批處理中資料的近似千位元組數(KB)。預設情況下,KILOBYTES_PER_BATCH 未知。
LASTROW [ = last_row ]
指定要複製的最後一行的行號。預設值是 0,表示指定資料檔案裡的最後一行。
MAXERRORS [ = max_errors ]
指定在大容量複製操作取消之前可能產生的錯誤的最大數目。不能被大容量複製操作匯入的每一行將被忽略而且被計為一次錯誤。假設沒有指定 max_errors,預設值為 0。
ORDER ( { column [ ASC | DESC ] } [ ,...n ] )
指定資料檔案裡的資料怎樣排序。假設裝載的資料依據表中的聚集索引進行排序,則能夠提高大容量複製操作的效能。假設資料檔案基於不同的順序排序,或表中沒有聚集索引,ORDER 子句將被忽略。給出的列名必須是目的表中有效的列。預設情況下,大容量插入操作假設資料檔案未排序。n是表示能夠指定多列的佔位符。
ROWS_PER_BATCH [ = rows_per_batch ]
指定每一批處理資料的行數(即 rows_per_bacth)。當沒有指定 BATCHSIZE 時使用,導致整個資料檔案作為單個事務傳送給server。server依據 rows_per_batch 優化大容量裝載。預設情況下,ROWS_PER_BATCH 未知。
ROWTERMINATOR [ = 'row_terminator' ]
指定對於 char 和 widechar 資料檔案要使用的行終止符。預設值是 /n(換行符)。
TABLOCK
指定對於大容量複製操作期間獲取一個表級鎖。假設表沒有索引而且指定了 TABLOCK,則該表能夠同一時候由多個client裝載。預設情況下,鎖定行為是由表選項 table lock on bulk load 決定的。僅僅在大容量複製操作期間控制鎖會降低表上的鎖爭奪,極大地提高效能。凝視BULK INSERT 語句能在使用者定義事務中執行。對於一個用 BULK INSERT 語句和 BATCHSIZE 子句將資料裝載到使用多個批處理的表或檢視中的使用者定義事務來說,回滾它將回滾全部傳送給 SQL Server 的批處理。許可權僅僅有 sysadmin 和 bulkadmin 固定server角色成員才幹執行 BULK INSERT。
演示樣例本例從指定的資料檔案裡匯入訂單具體資訊,該檔案使用豎槓 (|) 字元作為欄位終止符,使用 |/n 作為行終止符。
- BULK INSERT Northwind.dbo.[Order Details] FROM 'f:/orders/lineitem.tbl'
- WITH (
- FIELDTERMINATOR = '|',
- ROWTERMINATOR = '|/n'
- )
BULK INSERT Northwind.dbo.[Order Details] FROM 'f:/orders/lineitem.tbl' WITH ( FIELDTERMINATOR = '|', ROWTERMINATOR = '|/n' )
本例指定 FIRE_TRIGGERS 引數。
- BULK INSERT Northwind.dbo.[Order Details] FROM 'f:/orders/lineitem.tbl'
- WITH (
- FIELDTERMINATOR = '|',
- ROWTERMINATOR = ':/n',
- FIRE_TRIGGERS
- )
- =============================================================
- BULK INSERT
- [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ]
- FROM 'data_file'
- [ WITH
- (
- [ [ , ] BATCHSIZE = batch_size ] --BATCHSIZE指令來設定在單個事務中能夠插入到表中的記錄的數量
- [ [ , ] CHECK_CONSTRAINTS ] --指定在大容量匯入操作期間,必須檢查全部對目標表或檢視的約束。若沒有 CHECK_CONSTRAINTS 選項,則全部 CHECK 和 FOREIGN KEY 約束都將被忽略,而且在此操作之後表的約束將標記為不可信。
- [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ] --指定該資料檔案裡資料的內碼表
- [ [ , ] DATAFILETYPE =
- { 'char' | 'native'| 'widechar' | 'widenative' } ] --指定 BULK INSERT 使用指定的資料檔案型別值執行匯入操作。
- [ [ , ] FIELDTERMINATOR = 'field_terminator' ] --標識分隔內容的符號
- [ [ , ] FIRSTROW = first_row ] --指定要載入的第一行的行號。預設值是指定資料檔案裡的第一行
- [ [ , ] FIRE_TRIGGERS ] --是否啟動觸發器
- [ [ , ] FORMATFILE = 'format_file_path' ]
- [ [ , ] KEEPIDENTITY ] --指定匯入資料檔案裡的標識值用於標識列
- [ [ , ] KEEPNULLS ] --指定在大容量匯入操作期間空列應保留一個空值,而不插入用於列的不論什麼預設值
- [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]
- [ [ , ] LASTROW = last_row ] --指定要載入的最後一行的行號
- [ [ , ] MAXERRORS = max_errors ] --指定同意在資料中出現的最多語法錯誤數,超過該數量後將取消大容量匯入操作。
- [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ] --指定資料檔案裡的資料怎樣排序
- [ [ , ] ROWS_PER_BATCH = rows_per_batch ]
- [ [ , ] ROWTERMINATOR = 'row_terminator' ] --標識分隔行的符號
- [ [ , ] TABLOCK ] --指定為大容量匯入操作持續時間獲取一個表級鎖
- [ [ , ] ERRORFILE = 'file_name' ] --指定用於收集格式有誤且不能轉換為 OLE DB 行集的行的檔案。
- )]
BULK INSERT Northwind.dbo.[Order Details] FROM 'f:/orders/lineitem.tbl' WITH ( FIELDTERMINATOR = '|', ROWTERMINATOR = ':/n', FIRE_TRIGGERS ) ============================================================= BULK INSERT [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] FROM 'data_file' [ WITH ( [ [ , ] BATCHSIZE = batch_size ] --BATCHSIZE指令來設定在單個事務中能夠插入到表中的記錄的數量 [ [ , ] CHECK_CONSTRAINTS ] --指定在大容量匯入操作期間,必須檢查全部對目標表或檢視的約束。若沒有 CHECK_CONSTRAINTS 選項,則全部 CHECK 和 FOREIGN KEY 約束都將被忽略,而且在此操作之後表的約束將標記為不可信。 [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ] --指定該資料檔案裡資料的內碼表 [ [ , ] DATAFILETYPE = { 'char' | 'native'| 'widechar' | 'widenative' } ] --指定 BULK INSERT 使用指定的資料檔案型別值執行匯入操作。 [ [ , ] FIELDTERMINATOR = 'field_terminator' ] --標識分隔內容的符號 [ [ , ] FIRSTROW = first_row ] --指定要載入的第一行的行號。預設值是指定資料檔案裡的第一行 [ [ , ] FIRE_TRIGGERS ] --是否啟動觸發器 [ [ , ] FORMATFILE = 'format_file_path' ] [ [ , ] KEEPIDENTITY ] --指定匯入資料檔案裡的標識值用於標識列 [ [ , ] KEEPNULLS ] --指定在大容量匯入操作期間空列應保留一個空值,而不插入用於列的不論什麼預設值 [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ] [ [ , ] LASTROW = last_row ] --指定要載入的最後一行的行號 [ [ , ] MAXERRORS = max_errors ] --指定同意在資料中出現的最多語法錯誤數,超過該數量後將取消大容量匯入操作。 [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ] --指定資料檔案裡的資料怎樣排序 [ [ , ] ROWS_PER_BATCH = rows_per_batch ] [ [ , ] ROWTERMINATOR = 'row_terminator' ] --標識分隔行的符號 [ [ , ] TABLOCK ] --指定為大容量匯入操作持續時間獲取一個表級鎖 [ [ , ] ERRORFILE = 'file_name' ] --指定用於收集格式有誤且不能轉換為 OLE DB 行集的行的檔案。 )]
以下寫個個簡單的應用樣例
- bulk insert xsxt.dbo.tabletest from 'c:/data.txt'
- with(
- FIELDTERMINATOR=',',
- ROWTERMINATOR='/n'
- )