Sql Server の BULK INSERT (バルクインサート) には、CSV ではなく、TSV ファイルを使います。
本件に関わらず、プログラムの領域では CSV よりも TSV の方を使いましょう。
英語文章、区切り文字衝突、パース処理、大量データ処理、UNIX ツール連携処理、において TSV の方が優れているためです。
前提条件として、TSV ファイルはバルクインサートを行う DB テーブルと同じ列数を保持しているものとします。
Sql Server バルクインサート の Microsoft 公式解説は以下のリンクからご確認ください。
バルクインサート (Transact-SQL)
以下のコードはバルクインサートを実行する sql です。
SSMS にWindows認証でログインし、以下のコードの中で「対象データベース名」と「対象テーブル名」、「TSV ファイル格納パス」を変更してください。
はじめに必ず ROLLBACK モードでバルクインサートを実行してください。
ROLLBACK モードでエラーが発生しないことを確認した後、COMMIT モードでバルクインサートを実行してください。
切り替えフラグの [0], [1] を変更するだけで実行できる sql を作成しております。
USE 対象データベース名;
GO
DECLARE @IsProduction BIT = 0; -- 切り替えフラグ: 1 = 本番COMMIT、0 = テストROLLBACK
DECLARE @tableName NVARCHAR(100) = '対象テーブル名';
DECLARE @filePath NVARCHAR(255) = 'TSV ファイル格納パス';
DECLARE @sql NVARCHAR(MAX);
SET XACT_ABORT ON;
BEGIN TRANSACTION;
-- BULK INSERT
SET @sql = N'
BULK INSERT ' + QUOTENAME(@tableName) + N'
FROM ' + QUOTENAME(@filePath,'''') + N'
WITH (
FIELDTERMINATOR = ''\t'', -- タブ区切り
ROWTERMINATOR = ''\n'', -- 改行コード
CODEPAGE = ''65001'', -- UTF-8
TABLOCK
);';
EXEC sp_executesql @sql;
-- インサート後件数確認
SET @sql = N'SELECT COUNT(*) AS AfterCount FROM ' + QUOTENAME(@tableName) + ';';
EXEC sp_executesql @sql;
-- インサート後結果内容確認(TOP 1行のみ)
SET @sql = N'SELECT TOP 1 * FROM ' + QUOTENAME(@tableName) + ';';
EXEC sp_executesql @sql;
-- トランザクション制御
IF @IsProduction = 1
BEGIN
COMMIT TRANSACTION;
RAISERROR(N'データを本番投入しました。', 10, 1) WITH NOWAIT;
END
ELSE
BEGIN
RAISERROR(N'テスト用にロールバックしました。', 10, 1) WITH NOWAIT;
ROLLBACK TRANSACTION;
END;