大数据大数据 爬虫Python AI Sql

Sqlserver使用BULK同时导入文件夹内所有txt、csv

2019-02-26  本文已影响9人  michaelxwang

之前写过一篇文章具体介绍如何使用bulk导入txt,csv文件,其中详细介绍了bulk的基础知识,以及如何同时导入多个txt,csv文件。具体内容请单击Sqlserver使用BULK同时导入多个txt、csv文件

在上一篇文章里,虽然能同时导入多个文件,但是,还是有个弊端,需要更改文件名,还是不够方便。下面对上次导数脚本进行升级,不需要再更改文件名,直接导入文件夹内所有文件。

解决思路

首先、将文件夹中文件的【路径+名称】信息存储在一个表变量里。
然后、根据文件的【路径+名称】信息调整 bulk命令中的 data_file的值,并将命令存储在表变量中。
最后、执行存储在表变量中的SQL语句。

SQL命令解析

1.创建表变量 #files name字段用来存储文件名 sql字段用来存储sql语句
2.将文件夹中以.csv结尾的文件插入到 表变量中的 name字段中
3.将表变量#files中 name字段不是以.csv结尾的数据删除
--1.创建表变量 #files name字段用来存储文件名 sql字段用来存储sql语句
CREATE TABLE #files (name varchar(200) NULL, sql varchar(7000) NULL)
--2.将data文件夹中以.csv结尾的文件插入到 表变量中的 name字段中
INSERT #files(name)  exec master..xp_cmdshell 'dir /s/b C:\data\*.csv'
--3.将表变量#files中 name字段不是以.csv结尾的数据删除
DELETE #files WHERE coalesce(name, '') NOT LIKE '%.csv'

4.根据文件名设置sql语句,并更新到sql字段里
--4.根据文件名设置sql语句,并更新到sql字段里
UPDATE #files
SET   sql  = 'bulk insert [DatabaseName].[dbo].[table] from '''+name+''' 
        with (FIRSTROW =1,CODEPAGE=''936'',FIELDTERMINATOR = ''|'',ROWTERMINATOR = ''0x0A'')'

5.执行SQL命令
--5.执行SQL命令
DECLARE @sql varchar(8000)
DECLARE cur CURSOR STATIC LOCAL FOR
   SELECT sql FROM #files
        OPEN cur
            WHILE 1 = 1
                BEGIN
                    FETCH cur INTO @sql
                    IF @@fetch_status <> 0
                    BREAK
                    EXEC(@sql)
                    print(@sql)
                END
        DEALLOCATE cur
drop table #files

全部代码

---将C:\data\文件夹中所有的csv文件导入到[DatabaseName].[dbo].[table]表中

--1.创建表变量 #files name字段用来存储文件名 sql字段用来存储sql语句
CREATE TABLE #files (name varchar(200) NULL, sql varchar(7000) NULL)
--2.将data文件夹中以.csv结尾的文件插入到 表变量中的 name字段中
INSERT #files(name)  exec master..xp_cmdshell 'dir /s/b C:\data\*.csv'
--3.将表变量#files中 name字段不是以.csv结尾的数据删除
DELETE #files WHERE coalesce(name, '') NOT LIKE '%.csv'

--4.根据文件名设置sql语句,并更新到sql字段里
UPDATE #files
SET   sql  = 'bulk insert [DatabaseName].[dbo].[table] from '''+name+''' 
        with (FIRSTROW =1,CODEPAGE=''936'',FIELDTERMINATOR = ''|'',ROWTERMINATOR = ''0x0A'')'

--5.执行SQL命令
DECLARE @sql varchar(8000)
DECLARE cur CURSOR STATIC LOCAL FOR
   SELECT sql FROM #files
        OPEN cur
            WHILE 1 = 1
                BEGIN
                    FETCH cur INTO @sql
                    IF @@fetch_status <> 0
                    BREAK
                    EXEC(@sql)
                    print(@sql)
                END
        DEALLOCATE cur
drop table #files
上一篇 下一篇

猜你喜欢

热点阅读