使用T-SQL導入多個文件數據到SQL Server中


在我們的工作中,經常需要連續輸入多個文件的數據到SQL Server的表中,有時需要從相同或者不同的目錄中,同時將文件中的數據倒入。在這篇文章中,我們將討論如何同時把一個目錄中的文件的數據倒入到SQL Server中。 

    試驗環境
    我們先創建整個試驗的環境。創建文件目錄“C:\MyImport”,和三個文件a.csv、b.csv和c.csv,文件內容如下。同時,在SQL Server中創建一個表用來存放導入的數據。
        C:\MyImport\a.csv 
        1, MAK, A9411792711, 3400.25 
        2, Claire, A9411452711, 24000.33 
        3, Sam, A5611792711, 1200.34 
        C:\MyImport\b.csv 
        11, Rubon, 9671792711, 400.14 
        22, Mike, 9418952711, 4000.56 
        39, Hsu, 75611792511, 1230.00 
        C:\MyImport\c.csv 
        69, Lucy, 8411992710, 305.11 
        45, Grace, 3413452713, 246.52 
        33, Saint, 5461795716, 1278.70 
        Create Database Bank
        Go
        Use Bank
        go
        Create table Account
        (
            [ID] int, Name Varchar(100), 
            AccountNo varchar(100), Balance money
        )
        Go
        Create table logtable 
        (
            id int identity(1,1), 
            Query varchar(1000), 
            Importeddate datetime default getdate()
        )       

    方法 1: XP_CMDSHELL 和BULK INSERT
    這個方法使用xp_cmdshell和Bulk Insert的SQL命令把一個目錄中的文件倒入到SQL Server的表中。

創建存儲過程

    在數據庫中產生這個存儲過程,這個存儲過程有三個參數:文件路徑,文件擴展名和數據庫的表名。

Create procedure usp_ImportMultipleFiles @filepath varchar(500), 
@pattern varchar(100), @TableName varchar(128)
as
set quoted_identifier off
declare @query varchar(1000)
declare @max1 int
declare @count1 int
Declare @filename varchar(100)
set @count1 =0
create table #x (name varchar(200))
set @query ='master.dbo.xp_cmdshell "dir '+@filepath+@pattern +' /b"'
insert #x exec (@query)
delete from #x where name is NULL
select identity(int,1,1) as ID, name into #y from #x 
drop table #x
set @max1 = (select max(ID) from #y)
--print @max1
--print @count1
While @count1 <= @max1
begin
set @count1=@count1+1
set @filename = (select name from #y where [id] = @count1)
set @Query ='BULK INSERT '+ @Tablename + ' FROM "'+ @Filepath+@Filename+'" 
WITH ( FIELDTERMINATOR = ",",ROWTERMINATOR = "\n")'
--print @query
exec (@query)
insert into logtable (query) select @query
end

drop table #y

執行
執行上面的存儲過程,參數如下:
例1:輸入所有的c:\myimport目錄下的.csv文件到Account表中
Exec usp_ImportMultipleFiles 'c:\myimport\', '*.csv', 'Account'

例2:輸入所有的c:\myimport目錄下的文件到Account表中
Exec usp_ImportMultipleFiles 'c:\myimport\', '*.*', 'Account'

    方法 2: XP_CMDSHELL 和 BCP 公用程序
    這個方法使用 "xp_cmdshell" 和 "BCP.exe" 倒入一個目錄下的文件到SQL Server的表中。這個存儲過程以服務器名、數據庫名、文件路徑、文件擴展名和數據庫表名作為參數。
    注意:確信你運行SQL Server Agent的帳戶具有訪問你輸入的文件夾和服務器的權限。

創建存儲過程:
set quoted_identifier off
go
Create procedure usp_ImportMultipleFilesBCP @servername varchar(128),
@DatabaseName varchar(128), @filepath varchar(500), @pattern varchar(100), 
@TableName varchar(128)
as
declare @query varchar(1000)
declare @max1 int
declare @count1 int
Declare @filename varchar(100)
set @count1 =0
create table #x (name varchar(200))
set @query ='master.dbo.xp_cmdshell "dir '+@filepath+@pattern +' /b"'
insert #x exec (@query)
delete from #x where name is NULL
select identity(int,1,1) as ID, name into #y from #x 
drop table #x
set @max1 = (select max(ID) from #y)
--print @max1
--print @count1
--select * from #y
While @count1 <= @max1
begin
set @count1=@count1+1
set @filename = (select name from #y where [id] = @count1)
set @Query ='bcp "'+ @databasename+'.dbo.'+@Tablename + '" 
in "'+ @Filepath+@Filename+'" -S' + @servername + ' -T -c -r\n -t,'
set @Query = 'MASTER.DBO.xp_cmdshell '+ "'"+  @query +"'"
--print @query
EXEC ( @query)
insert into logtable (query) select @query
end

drop table #y

執行
    執行上面的存儲過程,參數如下:
例1:輸入所有的c:\myimport目錄下的.csv文件到Account表中
Exec usp_ImportMultipleFilesBCP 'SQL','Bank','c:\Myimport\','*.csv','Account'

例2:輸入所有的c:\myimport目錄下的文件到Account表中
Exec usp_ImportMultipleFilesBCP 'SQL','Bank','c:\Myimport\','*.*','Account'

    結果
    不管你使用方法一還是方法二,數據將會被導入到SQL Server的表中。如下所示:

 

1

MAK

A9411792711

3400.25

2

Claire

A9411452711

24000.33

3

Sam

A5611792711

1200.34

11

Rubon

9671792711

400.14

22

Mike

9418952711

4000.56

39

Hsu

75611792511

1230

69

Lucy

8411992710

305.11

45

Grace

3413452713

246.52

33

Saint

5461795716

1278.7

 

使用方法一產生的日志記錄如下表:

 

1

BULK INSERT Account FROM "c:\myimport\a.csv" WITH ( FIELDTERMINATOR = ",",ROWTERMINATOR = "\n")

3/1/042:15

2

BULK INSERT Account FROM "c:\myimport\b.csv" WITH ( FIELDTERMINATOR = ",",ROWTERMINATOR = "\n")

3/1/042:15

3

BULK INSERT Account FROM "c:\myimport\c.csv" WITH ( FIELDTERMINATOR = ",",ROWTERMINATOR = "\n")

3/1/042:15

 

使用方法二產生的日志記錄如下表:

 

1

MASTER.DBO.xp_cmdshell 'bcp "Bank.dbo.Account" in "c:\Myimport\a.csv" -SSQL -T -c -r\n -t,'

3/1/042:18

2

MASTER.DBO.xp_cmdshell 'bcp "Bank.dbo.Account" in "c:\Myimport\b.csv" -SSQL -T -c -r\n -t,'

3/1/042:18

3

MASTER.DBO.xp_cmdshell 'bcp "Bank.dbo.Account" in "c:\Myimport\c.csv" -SSQL -T -c -r\n -t,'

3/1/042:18

 

    總結
    像前面提到的一樣,這篇文章的目的是告訴你如何從一個文件夾中導入多個文件到SQL Server的表中。這些存儲過程可以進一步增強,可以用xp_getfiledetails來判斷轉入的文件的最后修改時間來確定文件的范圍。這些存儲過程也可以創建為定時執行的作業。在導入完成以后,你可以用rename或move命令來重命名或者移到不同的目錄中。

參考:

 

使用DTS導入多個文件數據到SQL Server中

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM