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/)