2016-07-26 28 views
0

ich diesen SQL-Befehl haben, die in einer gespeicherten Prozedur verwendet werden und wird geplant werden:SQL Bulk aus CSV aus einem Ordner

BULK INSERT Test101.dbo.Test102 
FROM 'C:\Bulk\samp.csv' 
WITH 
(
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
) 

Es funktioniert gut, aber was ich will zu tun ist alles zu verarbeiten, die .csv Dateien aus einem Ordner (sagen wir Bulk Ordner) automatisch. Ich meine, der Benutzer muss nicht den genauen Ort mit dem Dateinamen angeben, stattdessen wird die gespeicherte Prozedur alle .CSV Dateien aus diesem Ordner verarbeiten und die anderen Dateien ignorieren, wenn sie vorhanden sind.

Bitte helfen.

Vielen Dank.

+0

Wil, markieren Sie bitte Sachen richtig. MSFT sQL Server 'SQL- server ', halte' mysql' davon fern oder säubere dieses Tag in der Zukunft. – Drew

+0

@Drew, Sorry, das kannst du m e damit? –

+0

Vor Jahren, aber nicht im Moment. Es tut uns leid. Warten Sie auf die Profis zu zeigen: p – Drew

Antwort

0

versuchen, diese sicher, dass Sie die richtigen Berechtigungen und Einstellungen machen müssen xp_cmdshell

One Time Config ändern hier aktivieren tun: https://stackoverflow.com/a/5131503/2628302

--To Test if that worked run these commands. There should be no errors and should return list of files under c:\ 
declare @files table (ID int IDENTITY, FileName varchar(500)) 
insert into @files execute xp_cmdshell 'dir c:\ /b' 
select * from @files 

--wenn keine Fehler dann gehen diese SP erstellen Wie nachfolgend dargestellt. Dies ist derjenige, der durch die ganze Arbeit

CREATE PROCEDURE dbo.sp_BulkInsAllFilesInDirectory 
AS 
BEGIN 
    --a table to hold filenames 
    Declare @ALLFILENAMES as TABLE (WHICHPATH VARCHAR(255),WHICHFILE varchar(255)) 

    --some variables 
    declare @filename varchar(255), 
      @path  varchar(255), 
      @sql  varchar(8000), 
      @cmd  varchar(1000) 


    --get the list of files to process: 
    SET @path = 'C:\Bulk\' 
    SET @cmd = 'dir ' + @path + '*.csv /b' 
    INSERT INTO @ALLFILENAMES(WHICHFILE) 
    EXEC Master..xp_cmdShell @cmd 
    UPDATE @ALLFILENAMES SET WHICHPATH = @path where WHICHPATH is null 


    --cursor loop 
    declare c1 cursor for SELECT WHICHPATH,WHICHFILE FROM @ALLFILENAMES where WHICHFILE like '%.csv%' 
    open c1 
    fetch next from c1 into @path,@filename 
    While @@fetch_status <> -1 
     begin 
      --bulk insert won't take a variable name, so make a sql and execute it instead: 
      set @sql = 'BULK INSERT Temp FROM ''' + @path + @filename + ''' ' 
       + '  WITH ( 
         FIELDTERMINATOR = '','', 
         ROWTERMINATOR = ''\n'', 
         FIRSTROW = 2 
        ) ' 
     print @sql 
     exec (@sql) 

     fetch next from c1 into @path,@filename 
     end 
    close c1 
    deallocate c1 

END 

--- TEST es tut es wie so läuft (mit nur einer CSV-Datei in C beginnen. \ \ Verzeichnis BULK Wenn es für ein Werk wird es höchstwahrscheinlich arbeiten für mehr als eine Datei.

EXEC dbo.sp_BulkInsAllFilesInDirectory 

wenn es sehen Fehler sind. Lassen Sie hier eine Nachricht und ich werde morgen überprüfen. Viel Glück.

+0

Vielen Dank. Ich habe es versucht, aber die folgenden Fehler sind aufgetreten: –

+0

BULK INSERT PH_ProdCost.dbo.ProdCost FROM 'C: \ Test \ po.csv' MIT ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\ n', FIRSTROW = 2 ) Msg 4832, Ebene 16, Status 1, Zeile 1 Massenladung: In der Datendatei wurde ein unerwartetes Dateiende gefunden. Msg 7301, Ebene 16, Status 2, Zeile 1 Die erforderliche Schnittstelle ("IID_IColumnsInfo") vom OLE DB-Anbieter "BULK" für den Verbindungsserver "(null)" kann nicht abgerufen werden. –

+0

Hey! Es funktioniert jetzt. Ich danke dir sehr. Du hast meinen Tag gerettet. Hab einen guten :) –