SQL從文本導(dǎo)數(shù)據(jù)到數(shù)據(jù)庫(kù)用到的BULK INSERT
來(lái)源:程序員人生 發(fā)布時(shí)間:2014-04-27 21:04:46 閱讀次數(shù):3561次
建站學(xué)院文檔 如果你從事與數(shù)據(jù)庫(kù)相關(guān)的工作,有可能會(huì)涉及到將數(shù)據(jù)從外部數(shù)據(jù)文件插入倒SQL Server的操作。本文將為大家演示如何利用BULK INSERT命令來(lái)導(dǎo)入數(shù)據(jù),并講解怎樣通過(guò)改變?cè)撁畹囊恍┻x項(xiàng)以便更方便且更有效地插入數(shù)據(jù)。
BULK INSERT
在SQL Server中,BULK INSERT是用來(lái)將外部文件以一種特定的格式加載到數(shù)據(jù)庫(kù)表的T-SQL命令。該命令使開(kāi)發(fā)人員能夠直接將數(shù)據(jù)加載到數(shù)據(jù)庫(kù)表中,而不需要使用類(lèi)似于Integration Services這樣的外部程序。雖然BULK INSERT不允許包含任何復(fù)雜的邏輯或轉(zhuǎn)換,但能夠提供與格式化相關(guān)的選項(xiàng),并告訴我們導(dǎo)入是如何實(shí)現(xiàn)的。BULK INSERT有一個(gè)使用限制,就是只能將數(shù)據(jù)導(dǎo)入SQL Server。
插入數(shù)據(jù)下面的例子能讓我們更好的理解如何使用BULK INSERT命令。首先,我們來(lái)創(chuàng)建一個(gè)名為Sales的表,我們將要把來(lái)自文本文件的數(shù)據(jù)插入到這個(gè)表中。
CREATE TABLE [dbo].[Sales] ( [SaleID] [int], [Product] [varchar](10) NULL, [SaleDate] [datetime] NULL, [SalePrice] [money] NULL ) |
當(dāng)我們使用BULK INSERT命令來(lái)插入數(shù)據(jù)時(shí),不要啟動(dòng)目標(biāo)表中的觸發(fā)器,因?yàn)橛|發(fā)器會(huì)減緩數(shù)據(jù)導(dǎo)入的進(jìn)程。
在下一個(gè)例子中,我們將在Sales表上創(chuàng)建觸發(fā)器,用來(lái)打印插入到表中的記錄的數(shù)量。
CREATE TRIGGER tr_Sales ON Sales FOR INSERT AS BEGIN PRINT CAST(@@ROWCOUNT AS VARCHAR(5)) + ' rows Inserted.' END |
這里我們選擇文本文件作為源數(shù)據(jù)文件,文本文件中的值通過(guò)逗號(hào)分割開(kāi)。該文件包含1000條記錄,而且其字段和Sales表的字段直接關(guān)聯(lián)。由于該文本文件中的值是由逗號(hào)分割開(kāi)的,我們只需要指定FIELDTERMINATOR即可。注意,當(dāng)下面這條語(yǔ)句運(yùn)行時(shí),我們剛剛創(chuàng)建的觸發(fā)器并沒(méi)有啟動(dòng):
BULK INSERT Sales FROM 'c:SalesText.txt' WITH (FIELDTERMINATOR = ',') |
當(dāng)我們要的數(shù)據(jù)量非常大時(shí),有時(shí)候就需要啟動(dòng)觸發(fā)器。下面的腳本使用了FIRE_TRIGGERS選項(xiàng)來(lái)指明在目標(biāo)表上的任何觸發(fā)器都應(yīng)當(dāng)啟動(dòng):
BULK INSERT Sales FROM 'c:SalesText.txt' WITH (FIELDTERMINATOR = ',', FIRE_TRIGGERS) |
我們可以使用BATCHSIZE指令來(lái)設(shè)置在單個(gè)事務(wù)中可以插入到表中的記錄的數(shù)量。在前一個(gè)例子中,所有的1000條記錄都在同一個(gè)事務(wù)中被插入到目標(biāo)表里。下面的例子,我們將BATCHSIZE參數(shù)設(shè)置為2,也就是說(shuō)要對(duì)該表執(zhí)行500次獨(dú)立的插入事務(wù)。這也意味著啟動(dòng)500次觸發(fā)器,所以將有500咯打印指令輸出到屏幕上。
BULK INSERT Sales FROM 'c:SalesText.txt' WITH (FIELDTERMINATOR = ',', FIRE_TRIGGERS, BATCHSIZE = 2) |
BULK INSERT不僅僅可以應(yīng)用于SQL Server 2005的本地映射驅(qū)動(dòng)器。下面的語(yǔ)句將告訴我們?nèi)绾螐拿麨镕ileServer的服務(wù)器的D盤(pán)中將SalesText文件的數(shù)據(jù)導(dǎo)入。
BULK INSERT Sales FROM 'FileServerD$SalesText.txt' WITH (FIELDTERMINATOR = ',') |
有時(shí)候,我們?cè)趫?zhí)行導(dǎo)入操作以前,最好能先查看一下將要輸入的數(shù)據(jù)。下面的語(yǔ)句在使用BULK命令時(shí),使用了OPENROWSET函數(shù),以便從SalesText文本文件中讀取源數(shù)據(jù)。該語(yǔ)句同時(shí)還需要使用一個(gè)格式文件(此處沒(méi)有列出文件的具體內(nèi)容)來(lái)表明該文本文件中的數(shù)據(jù)格式。
SELECT * FROM OPENROWSET(BULK 'c:SalesText.txt' , FORMATFILE='C:SalesFormat.Xml' ) AS mytable; GO |
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)