Sqlserver使用BULK同时导入多个txt、csv文件

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
65001UFT-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

升级版已经发布,可以在不改文件名的前提下,直接导入文件夹内所有文件 详情请点击Sqlserver使用BULK同时导入文件夹内所有txt、csv文件

勇者无惧,强者无敌
    原文作者:michaelxwang
    原文地址: https://www.jianshu.com/p/41d2eec6f875
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞