之前写过一篇文章具体介绍如何使用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
网友评论