之前寫過一篇文章具體介紹如何使用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