SQLServerでCSVファイルをインポートする(その2)

データベースSQLServer,データベース

記事内に広告が含まれています。

過去の記事で「SQLServerでCSVファイルをインポートする」を記載しましたが、その記事ではフォーマットファイルを指定した方法を紹介しました。
今回はフォーマットファイルを使用しない方法を紹介します。

コーディング例

BEGIN
    DECLARE @InFile NVARCHAR(MAX) = 'C:\test.csv';
    
    IF OBJECT_ID('temp..#CsvData') IS NOT NULL DROP TABLE #CsvData;
    CREATE TABLE #CsvData (
         ID      NVARCHAR(50)
        ,Code    NVARCHAR(50)
        ,Name    NVARCHAR(50)
    );
    
    BEGIN TRY
        DECLARE @SQL NVARCHAR(MAX);
        SET @SQL = '';
        SET @SQL = @SQL + CHAR(13) + CHAR(10) + 'BULK INSERT #CsvData';
        SET @SQL = @SQL + CHAR(13) + CHAR(10) + 'FROM ''{InFile}''';
        SET @SQL = @SQL + CHAR(13) + CHAR(10) + 'WITH (';
        SET @SQL = @SQL + CHAR(13) + CHAR(10) + '    FORMAT = ''CSV''';
        SET @SQL = @SQL + CHAR(13) + CHAR(10) + '    ,FIRSTROW = 2';
        SET @SQL = @SQL + CHAR(13) + CHAR(10) + '    ,FIELDTERMINATOR = '',''';
        SET @SQL = @SQL + CHAR(13) + CHAR(10) + '    ,ROWTERMINATOR = ''\n''';
        SET @SQL = @SQL + CHAR(13) + CHAR(10) + '    ,TABLOCK';
        SET @SQL = @SQL + CHAR(13) + CHAR(10) + ');';
        SET @SQL = REPLACE(@SQL, '{InFile}', @InFile)
        EXEC sp_executesql @SQL;
        SELECT * FROM #CsvData;
    END TRY
    BEGIN CATCH
        PRINT '[ERROR]' + ERROR_MESSAGE();
    END CATCH
    
    DROP TABLE #CsvData;
END

test.csv

ID,Code,Name
1,00001,テスト1
2,00002,テスト2
3,00003,テスト3

実行結果

ID Code Name
1 00001 テスト1
2 00002 テスト2
3 00003 テスト3

2行目では、変数「@InFile」にCSVファイルのフルパスを指定しています。
CSVのインポートはSQLServerがインストールされたPC上で実行されるため、そのPC上にCSVファイルを配置する必要があります。
4行目では、一時テーブル「#CsvData」が既に存在すれば削除しています。
5行目~9行目にかけて一時テーブル「#CsvData」を作成しています。
13行目~22行目にかけて、変数「@SQL」にSQL文を格納しています。
「CHAR(13) + CHAR(10)」は改行コードであり、変数「@SQL」の内容を確認する際に見やすくするために改行コードを追加しています。
17行目の「FORMAT = "CSV"」はSQLServer2017以降であれば使用可能です。
18行目の「FIRSTROW = 2」はCSVファイルの2行目から取得することを指定しています。
19行目の「FIELDTERMINATOR = ","」はCSVファイルの各項目の区切り文字が「,」であることを指定しています。
20行目の「ROWTERMINATOR = "\n"」はCSVの行末が「\n」であることを指定しています。
21行目の「TABLOCK」はテーブルロックを行うように指定しており、インポート時にテーブルロックを行うことで高速化が期待できます。
CSVファイルのパスが動的(固定値でない)な場合はこのようにSQL文を文字列として組み立て、
23行目のREPLACE関数により文字列中の「{InFile}」の部分を変数「@InFile」に置き換えています。
24行目の「EXEC sp_executesql @SQL;」でSQLを実行しています。
25行目の「SELECT * FROM #CsvData;」でインポートした結果を出力しています。
もし、24行目の「EXEC sp_executesql @SQL;」でエラーが発生した場合は、28行目にジャンプし、エラーメッセージを表示しています。
最後に31行目の一時テーブル「#CsvData」を削除しています。

以上、SQLServerでCSVファイルをインポートする方法の紹介でした。

システムトラストでは一緒に働いていただける仲間を募集中です。
株式会社システムトラスト

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ