2013-02-08 12 views
1

我試圖自動化一個進程,它將更新我的SQL Server 2008 R2數據庫中的表。使用存儲過程查找文件名

我從csv格式的客戶端獲取約20列數據的文件。當它位於特定文件夾中時,我需要將該文件導入數據庫中的表中。如果它在那裏,我需要進行導入,然後將文件從基本文件夾移動到Processed文件夾。

我已經完成了導入例程來刪除原始表,創建一個新表,並將數據導入到表中。

我已經搜索瞭如何確定特定擴展名的特定文件夾中的文件名,還沒有找到任何可以幫助我的文件。

我也試圖做一個文件的移動(獨立於存儲過程),我想我錯過了一些東西。這裏是我的嘗試沒有成功:

declare @sql varchar (100) 
    set @sql = 'move E:\Data\check.csv E:\Data\Processed\ /Y' 
    exec master..xp_cmdshell @SQL, NO_OUTPUT 
    go 

TIA

+0

我發現在移動中的錯誤。我在DOS中試過,發現你需要識別完整的文件名才能移動它。這給我留下了同樣的問題,如果我找不到文件名,那麼我不能導入,我不能移動。 – 2013-02-08 16:59:48

回答

1

我寫了下面的存儲過程,列出在給定路徑中的文件:

ALTER procedure [dbo].[usp__ListFiles_xml] (
    @path varchar(8000), 
    @xmldata xml output 
) 
as 
begin 
    DECLARE @ProcName varchar(255) = OBJECT_NAME(@@PROCID); 

    declare @DirLines table (
     RowNum int identity(1,1) not null, 
     line varchar(8000) 
    ); 

    declare @DirCommand varchar(8000) = 'dir /A:-D /n "'[email protected]+'"'; 

    insert into @DirLines 
     exec xp_cmdshell @DirCOmmand; 

    declare @DirName varchar(8000) = (select SUBSTRING(line, 15, 8000) from @DirLines where RowNum = 4); 

    delete from @DirLines 
    where line is null or isnumeric(LEFT(line, 2)) = 0; 

    set @xmldata = (
     select substring(line, 40, 255) as FileName, 
       cast(replace(substring(line, 21, 18), ',', '') as bigint) as FileSize, 
       cast(left(line, 20) as DateTime) as CreationDateTime, 
       @DirName as DirName 
     from @DirLines 
     for xml raw('Dir'), type 
     ) 

    return; 
end; -- usp__ListFiles_xml 

您可以選擇的結果到一個表,找到你需要的文件,然後繼續從那裏做你的負載:

declare @xmldata xml; 

exec usp__ListFiles_xml @FileTemplate, @xmldata output; 

declare @Files table (
    FileName varchar(255), 
    FileSize bigint, 
    CreationDateTime DateTime, 
    DirName varchar(8000) 
    ); 
insert into @Files 
    select T.c.value('@FileName', 'varchar(255)') as FileName, 
      T.c.value('@FileSize', 'bigint') as FileSize, 
      T.c.value('@CreationDateTime', 'datetime') as CreationDateTime, 
      T.c.value('@DirName', 'varchar(8000)') as DirName 
    from @xmldata.nodes('Dir') as T(c); 
+0

這很酷。我可能在目錄中有其他文件,但我只關心.csv文件。在SP ups_Listfiles_xml的創建階段限制文件還是在之後有了@FileName時限制文件,並且如果使用* .csv則有個案例? – 2013-02-08 17:46:12

+0

在usp_ListFiles_xml中,你有一個_spcalls插入_spcalls(spname,args) SELECT @ProcName, (''''+ coalesce(@path,'')+''''我在調用這個時遇到錯誤usp。 ); – 2013-02-08 19:01:03

+0

@TimVavra。 。 。哎呀。我沒有完全清理代碼。這是我用來跟蹤所有存儲過程調用的表格。 – 2013-02-08 19:01:57