2016-07-19 9 views
0

私はテーブルのリストを持っており、テーブルごとに私はCSVとフォーマットファイルを持っています。私はこれまでに対応する形式のファイルですべてのCSVファイルをインポートするバッチスクリプトを用意しようとしています。問題はSQLビットで発生していますが、バッチスクリプトの変数をSQLクエリテーブルのファイル名を使用するMSSQLの一括挿入

オフエコー/ F "トークン= *" %%(tablelist.txt)におけるA行うエコー%% A SQLCMD -S BNE-MORGANS-SQL -d frontoffice -Q「bulkinsert.sqlためオフエコー「-V 'H:\セットアップ\ %% A.csv' 'H:\セットアップ\ %% A.format'

それは言う:

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

私はそれが好きで実行する場合:

一括挿入mycomp.addressをから 'E:\ SQLDataのバックアップの\ address.csv \'( FIRSTROW = 2、 FORMATFILE =「E WITH:\ SQLDataをバックアップ\ \ address.format '); GO

これはもちろんですが、150csvsのように動作します。

答えて

0

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ブログプロモーション)を処理します

関連する問題