1. 程式人生 > >Bulk Insert:將文字資料(csv和txt)匯入到資料庫中

Bulk Insert:將文字資料(csv和txt)匯入到資料庫中

將文字資料匯入到資料庫中的方法有很多,將文字格式(csv和txt)匯入到SQL Server中,bulk insert是最簡單的實現方法

1,bulk insert命令,經過簡化如下

BULK INSERT schema_name . table_name 
FROM 'data_file' 
WITH 
(
FIELDTERMINATOR = 'field_terminator',
ROWTERMINATOR = 'row_terminator',
DATAFILETYPE=‘WideChar’
);

2,使用bulk insert 將txt資料匯入到資料庫中,文字資料使用Tab分割Column,使用換行符分割row。

--create staging table
create table dbo.txt_staging
(
col1 nvarchar(255),
col2 nvarchar(255),
col3 nvarchar(255)
)
go

--populate data 
bulk insert dbo.txt_staging
from N'D:\test.txt'
WITH(
    FIELDTERMINATOR = '\t',
    ROWTERMINATOR = '\n'
)

3,使用bulk insert 將csv的資料匯入資料庫中
CSV檔案使用“,”作為列分隔符,使用“\n”作為行分隔符

--populate data 
bulk insert dbo.txt_staging
from N'D:\abc.csv'
WITH(
    FIELDTERMINATOR = N',',
    ROWTERMINATOR = N'\n',
    CODEPAGE =N'raw'
)

3,在匯入Unicode時,需要將.txt文件儲存為Unicode 編碼方式

在使用bulk insert匯入時,必須設定DATAFILETYPE='widechar',選項可能值有: 'char' | 'native'| 'widechar' | 'widenative' ,預設值是char。

如果有些Column沒有值,設定 KEEPNULLS   選項,表示將該column設定為NULL。

bulk insert dbo.txt_staging
from N'D:\abc.txt'
WITH(
    FIELDTERMINATOR = '\t',
    ROWTERMINATOR = '\n',
    DATAFILETYPE ='widechar' ,
    KEEPNULLS
)

附:Bulk Insert 命令的呼叫格式:

  • BULK INSERT  [ schema_name ] . [ table_name ]    
  • FROM 'data_file'    
  • WITH (Arguments)]

重要引數註釋:

  • data_file ':指定資料檔案的full path,bulk insert命令將資料從該檔案匯入到Target Table中
  • ROWTERMINATOR 'row_terminator' : 指定分隔行的字元,使用該字元來分割行(Row);
  • FIELDTERMINATOR 'field_terminator' :指定分隔欄位的字元,使用該字元來分割欄位(Field或Column);
  • DATAFILETYPE = { 'char' | 'native'| 'widechar' | 'widenative' }:指定data file編碼(Encoding)的型別,推薦使用widechar編碼;
  • CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } :如果 data file 中含有單位元組(char或varchar)字元資料,使用CodePage引數指定字元列的CodePage;
  • BATCHSIZE = batch_size :指定一個batch包含的資料行數量,在將資料複製到Table中時,每一個Batch作為一個單獨的事務,如果一個batch複製失敗,那麼事務回滾。預設情況下,data file中的所有資料作為一個batch。Specifies the number of rows in a batch. Each batch is copied to the server as one transaction. If this fails, SQL Server commits or rolls back the transaction for every batch. By default, all data in the specified data file is one batch. 
  • CHECK_CONSTRAINTS :指定在執行bulk insert操作期間,必須檢查插入的資料是否滿足Target Table上的所有約束。如果沒有指定 CHECK_CONSTRAINTS 選項,則所有 CHECK 和 FOREIGN KEY 約束都將被忽略,並且,在此操作之後,表上的所有約束將標記為不可信(not-trusted);   
  • FIRE_TRIGGERS :指定是否啟動Insert觸發器,如果指定該選項,每個batch成功插入後,會執行Insert觸發器;如果不指定該選項,不會執行Insert 觸發器;
  • KEEPIDENTITY :指定將data file中的標識值插入到標識列(Identity Column)中,如果不指定KeepIdentity選項,Target Table中的ID列會自動分配唯一的標識值;
  • KEEPNULLS:指定在執行bulk insert操作期間,空列(Empty Columns)應保留NULL值,而不是插入列的預設值
  • TABLOCK :指定在執行bulk insert操作期間,獲取一個表級鎖,持有表級鎖,能夠減少鎖競爭(Lock Contention),提高匯入效能

參考doc: