BULK语句基础
BULK有很多参数,但是常用的只有几个,下面简单介绍一下
bulk insert [DatabaseName].[dbo].[table] from 'C:\data.txt'
with(
FIRSTROW =1, --指定要加载的第一行的行号。默认值是指定数据文件中的第一行
CODEPAGE=''936'', --数据库中的编码类型
FIELDTERMINATOR='','', --分隔符
ROWTERMINATOR='/n' --换行符
)
代码行中的命名规则
下面代码均使用该命名规则!!![DatabaseName].[dbo].[table] 指的是某个数据库中的表的名字
C:\ 指的是文件所在路径,例:C:\Program Files\ 指的是在C盘Program Files文件夹里的文件
data.txt 指的是所需导入文件的名称
- FIRSTROW 属性
指定要加载的第一行的行号。默认值是指定数据文件中的第一行。FIRSTROW 从 1 开始。
注意:FIRSTROW 属性不可用于跳过列标题。 BULK INSERT 语句不支持 跳过标题。 跳过行时, SQL Server 数据库引擎只考虑字段终止符,而不会对所跳过行的字段中的数据进行验证。 - CODEPAGE属性
是数据库的编码类型。若导入数据库的中文数据是乱码,往往与这个有关!!!
常用编码类型:
编码 | 编码含义 |
---|---|
936 | 简体中文GBK |
65001 | UFT-8 |
- FIELDTERMINATOR属性
标识分隔内容的符号。一般csv的分隔符是“,”,txt的话可能是空格或者其他符符号比如“ | ”。 - ROWTERMINATOR属性
标识分隔行的符号 ,即换行符
常见换行符:
换行符 | 含义 | 常见显示 |
---|---|---|
0x0D | 指的是“回车” | \r |
0x0A | 指的是“换行” | \n |
0x0D + 0x0A | 回车换行 | \r\n |
char(13) | 指的是“回车” | \r |
char(10) | 指的是“换行” | \n |
BULK语法中全部参数如下:
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 行集的行的文件。
)]
ps.根本看不下去,具体使用方法点击下方的链接参考官方文档。
现在我们来看如何导入表
步骤1 创建表结构
通过BULK方式导入数据,首先需要数据库里有该表的空的表结构。
这时可以通过create table语句创建,也可以用Excel文件复制个表头,手动导入表结构。
比如说创建好表结构的空表为:[dbo].[table]
步骤2 执行代码
CSV
导入单个csv
DECLARE @bulk_cmd nvarchar(1000)
SET @bulk_cmd = 'BULK INSERT [DatabaseName].[dbo].[table] ' +
'FROM '+'''C:\data.csv'''+'WITH (FIELDTERMINATOR = '','',CODEPAGE=''936'',FIRSTROW=1,ROWTERMINATOR = '''+char(10)+''')'
EXEC(@bulk_cmd)
go
循环导入多个csv
循环导入的逻辑是把CSV文件的文件名改成 data(1).csv,data(2).csv…data(18).csv的形式,放入循环中,循环执行上面的单个csv文件导入的命令。
declare @n int,@filename varchar(255),@sql varchar(1000)
set @n=1
while @n<=18
begin
set @filename='data('+ltrim(rtrim(str(@n)))+').csv'
print @filename
set @sql='bulk insert [DatabaseName].[dbo].[table] from ''C:\'+@filename+'''
with (FIRSTROW =1,CODEPAGE=''936'',FIELDTERMINATOR = '','',ROWTERMINATOR = '''+CHAR(10)+''')'
print @sql
exec(@sql)
set @n=@n+1
end
TXT
导入单个txt
truncate table [dbo].[PINGZHENG201702]
DECLARE @bulk_cmd nvarchar(1000)
SET @bulk_cmd = 'BULK INSERT [DatabaseName].[dbo].[table] ' +
'FROM '+'''C:\文件名.txt'''+'WITH (FIELDTERMINATOR = '','',CODEPAGE=''936'',FIRSTROW=1,ROWTERMINATOR = '''+char(10)+''')'
EXEC(@bulk_cmd)
go
循环导入多个txt
循环导入的逻辑是把TXT文件的文件名改成 data(1).txt,data(2).txt…data(18).txt的形式,放入循环中,循环执行上面的单个txt文件导入的命令。
declare @n int,@filename varchar(255),@sql varchar(1000)
set @n=10
while @n<=12
begin
set @filename='data('+ltrim(rtrim(str(@n)))+').txt'
print @filename
set @sql='bulk insert [DatabaseName].[dbo].[table] from ''C:\'+@filename+'''
with (FIRSTROW =1,CODEPAGE=''936'',FIELDTERMINATOR = ''|'',ROWTERMINATOR=''0x0A'')'
print @sql
exec(@sql)
set @n=@n+1
end