SQLServerでCSVファイルをインポートする(その2)
過去の記事で「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ファイルをインポートする方法の紹介でした。







