Sql server 中的bulk insert語句使用


Sql server 的bulk insert語句可以高效的導入大數據量的平面文件(txt,csv文件)到數據庫的一張表中,其用法如下:

bulk insert test
from 'f:\test.txt'
with
(fieldterminator=',',
rowterminator='\n')
其中"test"是數據庫表的名字,"f:\test.txt"是導入平面文件的地址,fieldterminator指定平面文件中列的分隔符是什么,rowterminator指定平面文件中行的結束符是什么。

 

還可以使用FIRSTROW和LASTROW限制行數。如下COPY前三行:

bulk insert test
from 'f:\test.txt'
with
(fieldterminator=',',
rowterminator='\n',
FIRSTROW =1,
LASTROW=3)
要把平面文件數據導入到數據庫表中,平面文件只有3個字段,數據庫表有7個字段,
怎么把平面文件字段的對應到表的字段,如何用bulk insert來實現?

數據庫表 userinfo

CREATE TABLE userinfo
(
id INT identity,
userName varchar(20),
pass varchar(20),
address varchar(100),
phone varchar(20),
email varchar(128),
registerTime datetime
)
平面文件數據是F:\test.txt

userName,address,phone
hua,湖南,5971898
jan,重慶,2334512
wang, 北京, 100201
先在G盤存放一個格式化xml文件
G:\format.xml

<?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="," MAX_LENGTH="20" COLLATION="Chinese_PRC_CI_AS"/>
<FIELD ID="2" xsi:type="CharTerm" TERMINATOR="," MAX_LENGTH="100" COLLATION="Chinese_PRC_CI_AS"/>
<FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="20" COLLATION="Chinese_PRC_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="userName" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="2" NAME="address" xsi:type="SQLVARYCHAR"/>
<COLUMN SOURCE="3" NAME="phone" xsi:type="SQLVARYCHAR"/>
</ROW>
</BCPFORMAT>
然后使用bulk insert語句時,采用FORMATFILE參數指定該format.xml文件

BULK INSERT userinfo
FROM 'F:\test.txt'
WITH
(
FORMATFILE = 'G:\format.xml',
FIELDTERMINATOR=',',
ROWTERMINATOR='\n',
FIRSTROW = 2
)
這樣bulk insert語句就會按照format.xml文件中的列映射,將平面文件F:\test.txt的三列數據,依次插入到表userinfo的userName、address、phone這三個字段上了。

 

疑難解答

 1.最好使用十六進制ASCII碼來聲明ROWTERMINATOR

有時候當我們的txt或csv文件的文件頭沒有聲明文件的編碼方式(比如txt或csv文件是936-GBK或者UTF-8等編碼方式,但是在其文件頭沒有聲明)時,會導致bulk insert語句的ROWTERMINATOR參數失效,比如當我在導入一個test.txt文件是936-GBK編碼方式的時候,我發現明明文件中的換行符是'\n',但是當我聲明ROWTERMINATOR='\n'的時候根本不起作用,bulk insert老是找不到文件中的換行符進而報錯。

 

然后我通過網上查資料發現,原來bulk insert的ROWTERMINATOR參數,可以使用十六進制ASCII碼來表示換行符是什么。比如'\n'的ASCII碼是十進制12,十六進制0A,那么我們可以在bulk insert語句中聲明0x0a來作為ROWTERMINATOR表示換行符'\n',如下所示:

BULK INSERT userinfo
FROM 'F:\test.txt'
WITH
(
FIELDTERMINATOR='|',
ROWTERMINATOR='0x0a',
FIRSTROW =1,
LASTROW=1000,
CODEPAGE='936'
)
實驗發現當我用十六進制ASCII碼聲明bulk insert的ROWTERMINATOR參數后,sql server成功識別出了文件中每一行結束的位置。同樣如果換行符是'\r',那么我們可以聲明ROWTERMINATOR為十六進制ASCII碼0x0d。所以當你使用常規字符(例如'\n'、'\r'等)來給bulk insert的ROWTERMINATOR參數賦值不起作用的時候,你可以嘗試使用字符的十六進制ASCII碼來給ROWTERMINATOR參數賦值,bulk insert的ROWTERMINATOR參數可以根據十六進制ASCII碼准確識別出數據文件中的換行符。

 

2.使用CODEPAGE參數聲明文件的編碼方式

CODEPAGE參數可以聲明txt或csv文件的編碼方式是什么,有時候bulk insert無法識別出導入文件的編碼方式,會導致從文件導入的數據是亂碼,這時候如果我們知道文件的編碼方式,就可以使用CODEPAGE參數告訴bulk insert文件使用的是什么編碼,從而避免數據導入到數據庫后變為亂碼。比如上面的sql中我們就用CODEPAGE參數聲明了導入文件的編碼是936(GBK)

原文鏈接:https://blog.csdn.net/sunwenwu521/java/article/details/91813050


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM