之前寫過一篇文章具體介紹如何使用bulk導入txt识补,csv文件族淮,其中詳細介紹了bulk的基礎知識,以及如何同時導入多個txt,csv文件凭涂。具體內容請單擊Sqlserver使用BULK同時導入多個txt祝辣、csv文件
在上一篇文章里,雖然能同時導入多個文件切油,但是蝙斜,還是有個弊端,需要更改文件名澎胡,還是不夠方便孕荠。下面對上次導數(shù)腳本進行升級,不需要再更改文件名攻谁,直接導入文件夾內所有文件稚伍。
解決思路
首先、將文件夾中文件的【路徑+名稱】信息存儲在一個表變量里戚宦。
然后个曙、根據(jù)文件的【路徑+名稱】信息調整 bulk命令中的 data_file的值,并將命令存儲在表變量中阁苞。
最后、執(zhí)行存儲在表變量中的SQL語句祠挫。
SQL命令解析
1.創(chuàng)建表變量 #files name字段用來存儲文件名 sql字段用來存儲sql語句
2.將文件夾中以.csv結尾的文件插入到 表變量中的 name字段中
3.將表變量#files中 name字段不是以.csv結尾的數(shù)據(jù)刪除
--1.創(chuàng)建表變量 #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結尾的數(shù)據(jù)刪除
DELETE #files WHERE coalesce(name, '') NOT LIKE '%.csv'
4.根據(jù)文件名設置sql語句,并更新到sql字段里
--4.根據(jù)文件名設置sql語句,并更新到sql字段里
UPDATE #files
SET sql = 'bulk insert [DatabaseName].[dbo].[table] from '''+name+'''
with (FIRSTROW =1,CODEPAGE=''936'',FIELDTERMINATOR = ''|'',ROWTERMINATOR = ''0x0A'')'
5.執(zhí)行SQL命令
--5.執(zhí)行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.創(chuàng)建表變量 #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結尾的數(shù)據(jù)刪除
DELETE #files WHERE coalesce(name, '') NOT LIKE '%.csv'
--4.根據(jù)文件名設置sql語句,并更新到sql字段里
UPDATE #files
SET sql = 'bulk insert [DatabaseName].[dbo].[table] from '''+name+'''
with (FIRSTROW =1,CODEPAGE=''936'',FIELDTERMINATOR = ''|'',ROWTERMINATOR = ''0x0A'')'
--5.執(zhí)行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