BULK INSERT
に変数を使用することはできませんが、動的SQLを使用してファイルのリストを処理できます。
PSV(パイプセパレート値)のインポートに使用したコードは、状況に応じて変更してください。これにはxp_cmdShell
が有効になっている必要があります。
セットアップ:インポートするファイルのリストをつかむために
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);
最初の実行dir
:
--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
今、ファイル名からテーブル名を解析します。これは私のソリューションに特有のものです - コードを自分のものに合わせて変更してください。
-
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);
は今、各ファイル
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;
(ここでは、元の記事https://www.rednotebluenote.com/2016/04/importing-psma-geocoded-national-address-file-g-naf-to-sql-server/ Gratutiousブログプロモーション)を処理します