Sqlserver使用BULK同時導入文件夾內所有txt、csv文件

之前寫過一篇文章具體介紹如何使用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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章