2016-07-19 1 views
0

j'ai une liste des tables et pour chaque table je CSV et un fichier de format. Je suis en train de comeup avec un script batch qui importerait tous les csv avec leur format les fichiers correspondants jusqu'à présent, j'ai ce :, le problème vient du bit sql, comment puis-je utiliser les variables à partir du script batch dans la requête SQLMSSQL insertion en bloc en utilisant les noms de fichiers pour les tables

echo off echo off for/F "jetons = *" %% A (tablelist.txt) faire écho %% A sqlcmd -S BNE-MORGANS-SQL -d FrontOffice -Q « bulkinsert.sql "-V 'H: \ setup \ %% .csv contenant' 'H: \ setup \ %% A.format'

Il dit:

Sqlcmd: ':\setup\%A.csv' 'H:\setup\%A.format'': Unexpected argument. Enter '-?' for help. 

si i géré comme:

BULK INSERT DE mycomp.address 'E: \ SQLData \ Backup \ Address.csv' AVEC ( firstrow = 2, FORMATFILE = « E: \ SQLData \ Backup \ address.format '); GO

cela fonctionne bien sûr, mais j'ai comme un 150 csvs.

Répondre

0

Vous ne pouvez pas utiliser des variables dans BULK INSERT pour les noms de fichiers, vous pouvez toutefois utiliser SQL dynamique pour traiter une liste de fichiers.

Voici le code que je l'habitude d'importer un tas de PSVs (pipe valeurs seperated), modifier en fonction de votre situation. Cela nécessite xp_cmdShell activé.

Configuration:

CREATE TABLE #Files (
    Path VARCHAR(200) 
    ,FileName VARCHAR(200) 
    ,TableName VARCHAR(50) 
); 

--some variables 
DECLARE 
    @Path VARCHAR(200) 
    ,@FileName VARCHAR(200) 
    ,@TableName VARCHAR(50) 
    ,@sql VARCHAR(4000) 
    ,@cmd VARCHAR(4000); 

Première course dir pour saisir une liste de fichiers à importer:

--List CSV files to import 

SET @Path = 'D:\CSVFiles\' 

SET @cmd = 'dir "'+ @path + '*.psv" /b' 

INSERT INTO #Files(FileName) EXEC Master..xp_cmdShell @cmd 
UPDATE #Files SET Path = @path WHERE PATH IS NULL 

--Remove any null filenames 
DELETE FROM #Files WHERE FileName IS NULL 

Parse Maintenant, le nom de la table du nom de fichier. Ceci est spécifique à ma solution - changez le code en fonction du vôtre.

UPDATE 
    #Files 
SET 
    TableName = CASE WHEN FileName LIKE 'Authority_Code%' 
        THEN SUBSTRING(FileName, Second.Pos + 1, Last.Pos - Second.Pos - 1) 
        ELSE SUBSTRING(FileName, First.Pos + 1, Last.Pos - First.Pos - 1) 
       END 
FROM 
    #Files 
CROSS APPLY (SELECT CHARINDEX('_', FileName)) AS First (Pos) 
CROSS APPLY (SELECT CHARINDEX('_', FileName, First.Pos + 1)) AS Second (Pos) 
CROSS APPLY (SELECT LEN(FileName) - CHARINDEX('_', REVERSE(FileName)) + 1) AS Last (Pos); 

processus Maintenant, chaque fichier

DECLARE cur CURSOR 
FOR 
    SELECT 
     Path 
     ,FileName 
     ,TableName 
    FROM 
     #Files; 
OPEN cur; 
FETCH NEXT FROM cur INTO @Path, @FileName, @TableName; 
WHILE @@fetch_status <> -1 
    BEGIN 

     SET @sql = 'BULK INSERT ' + QUOTENAME(@TableName) + ' FROM ''' + @Path + @FileName + ''' ' + 
     ' WITH (FIELDTERMINATOR = ''|'', ROWTERMINATOR = ''\n'', FIRSTROW = 2, ROWS_PER_BATCH=100000, TABLOCK) '; 

     EXEC (@sql); 

     FETCH NEXT FROM cur INTO @Path, @FileName, @TableName; 
    END; 
CLOSE cur; 
DEALLOCATE cur; 

(promo blog Gratutious - article original ici https://www.rednotebluenote.com/2016/04/importing-psma-geocoded-national-address-file-g-naf-to-sql-server/)