SQL Server的Bulk Insert語(yǔ)句可以將本地或遠(yuǎn)程的數(shù)據(jù)文件批量導(dǎo)入到數(shù)據(jù)庫(kù)中,,速度非常的快。遠(yuǎn)程文件必須共享才行,,文件路徑須使用通用約定(UNC)名稱,,即"\\服務(wù)器名或IP\共享名\路徑\文件名"的形式。
* 1. 由于Bulk Insert通常配合格式化文件批量導(dǎo)入數(shù)據(jù)更方便,,所以這里先介紹bcp工具導(dǎo)出格式化文件的方法,。
bcp是SQL Server提供的命令行實(shí)用工具提供了數(shù)據(jù)的導(dǎo)出、導(dǎo)入,、格式文件導(dǎo)出等功能,,導(dǎo)出格式化文件的語(yǔ)法如下:
Sql代碼
bcp 數(shù)據(jù)庫(kù)名.用戶名.表名 format nul -- 這里的nul必須存在,用于不是導(dǎo)出和導(dǎo)入數(shù)據(jù)的情況下
-f 輸出的格式化文件名 [-x] -c -- -x參數(shù)指定輸出的格式文件為xml格式(默認(rèn)非xml格式); -c參數(shù)指定數(shù)據(jù)存儲(chǔ)方式為字符,,并默認(rèn)指定'\t'作為字段間隔符;'\n'作為行間隔符
[-t 字段間隔符] [-r 行間隔符號(hào)] -- -t與-r參數(shù)可選,,用于覆蓋-c指定的默認(rèn)間隔符
-T -- 指定數(shù)據(jù)庫(kù)連接可信,即使用Windows身份登錄
* 2. Bulk Insert
根據(jù)格式文件導(dǎo)入數(shù)據(jù)文件,,語(yǔ)法格式如下:
Sql代碼
Bulk insert 數(shù)據(jù)庫(kù)名.用戶名.表名
from '數(shù)據(jù)文件路徑'
with
(
formatfile = '格式文件路徑',
FirstRow = 2 --指定數(shù)據(jù)文件中開(kāi)始的行數(shù),,默認(rèn)是1
)
* 3. OPENRORWSET(BULK)函數(shù)
有時(shí),使用OPENROWSET(BULK)函數(shù)可以更靈活地選取想要的字段插入到原表或者其他表中,,其語(yǔ)法格式為:
Sql代碼
INSERT INTO to_table_name SELECT filed_name_list
FROM OPENROWSET(BULK N'path_to_data_file', FORMATFILE=N'path_to_format_file') AS new_table_name
當(dāng)然,該函數(shù)也可以這么使用:
Sql代碼
SELECT field_name_list INTO temp_table_name
FROM OPENROWSET(BULK N'path_to_data_file', FORMATFILE=N'path_to_format_file') AS new_table_name
下面舉一個(gè)完整的例子:
1)創(chuàng)建數(shù)據(jù)庫(kù),、表并填充測(cè)試數(shù)據(jù),,腳本如下:
Sql代碼
-- 創(chuàng)建數(shù)據(jù)庫(kù)
CREATE DATABASE [db_mgr]
GO
--創(chuàng)建測(cè)試表
USE db_mgr
CREATE TABLE dbo.T_Student(
F_ID [int] IDENTITY(1,1) NOT NULL,
F_Code varchar(10) ,
F_Name varchar(100) ,
F_Memo nvarchar(500) ,
F_Memo2 ntext ,
PRIMARY KEY (F_ID)
)
GO
--填充測(cè)試數(shù)據(jù)
Insert Into T_Student(F_Code, F_Name, F_Memo, F_Memo2) select
'code001', 'name001', 'memo001', '備注001' union all select
'code002', 'name002', 'memo002', '備注002' union all select
'code003', 'name003', 'memo003', '備注003' union all select
'code004', 'name004', 'memo004', '備注004' union all select
'code005', 'name005', 'memo005', '備注005' union all select
'code006', 'name006', 'memo006', '備注006'
2)我們可以使用SQL Server的master..xp_cmdshell存儲(chǔ)過(guò)程將CMD的命令傳給系統(tǒng),這樣就可以直接在SQL Server的查詢處理器中直接輸入bcp的命令,,而不用切換到命令模式下執(zhí)行,。SQL Server 出于安全目的默認(rèn)將該存儲(chǔ)過(guò)程禁用了,開(kāi)啟方法如下:
Sql代碼
--開(kāi)啟xp_cmdshell存儲(chǔ)過(guò)程(開(kāi)啟后有安全隱患)
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;
3)使用bcp導(dǎo)出格式文件:
Sql代碼
EXEC master..xp_cmdshell 'BCP db_mgr.dbo.T_Student format nul -f C:/student_fmt.xml -x -c -T'
4)使用bcp導(dǎo)出數(shù)據(jù)文件:
Sql代碼
EXEC master..xp_cmdshell 'BCP db_mgr.dbo.T_Student out C:/student.data -f C:/student_fmt.xml -T'
truncate table db_mgr.dbo.T_Student -- 將表中數(shù)據(jù)清空
注意:在實(shí)際使用過(guò)程中,,數(shù)據(jù)文件可以由程序生成,,如日志記錄等!
5)使用Bulk Insert語(yǔ)句批量導(dǎo)入數(shù)據(jù)文件:
Sql代碼
BULK INSERT db_mgr.dbo.T_Student
FROM 'C:/student.data'
WITH
(
FORMATFILE = 'C:/student_fmt.xml'
)
6)使用OPENROWSET(BULK)的例子:
Sql代碼
INSERT INTO db_mgr.dbo.T_Student(F_Code, F_Name) SELECT F_Code, F_Name
FROM OPENROWSET(BULK N'C:/student_c.data', FORMATFILE=N'C:/student_fmt_c.xml') AS new_table_name -- T_Student表必須已存在
SELECT F_Code, F_Name INTO db_mgr.dbo.tt
FROM OPENROWSET(BULK N'C:/student_c.data', FORMATFILE=N'C:/student_fmt_c.xml') AS new_table_name -- tt表可以不存在