公開:2025-10-14   更新:--

BULK INSERT で大量のデータを一括取り込みする (Sql Server)

目次

TSV ファイルを作成する

Sql Server の BULK INSERT (バルクインサート) には、CSV ではなく、TSV ファイルを使います。
本件に関わらず、プログラムの領域では CSV よりも TSV の方を使いましょう。
英語文章、区切り文字衝突、パース処理、大量データ処理、UNIX ツール連携処理、において TSV の方が優れているためです。
前提条件として、TSV ファイルはバルクインサートを行う DB テーブルと同じ列数を保持しているものとします。

Sql Server バルクインサート の Microsoft 公式解説は以下のリンクからご確認ください。
バルクインサート (Transact-SQL)

  1. データベーステーブルにインサートするデータをテキストエディタに張り付けます。
    このとき、データの区切り文字はタブ区切りにします。

  2. テキストエディタに名前を付けて保存します。
    ・ファイルの種類は [ユーザー指定] に設定してください。
    ・ファイル名に [.tsv] の拡張子を付加した状態で任意の名称を入力してください。
    ・文字コードは [UTF-8] を指定してください。
    ・「BOM」のチェックを外してください。BOM 無しとして保存します。
    ・最後に [保存] ボタンをクリックしてください。

  3. 作成した TSV ファイルを格納するフォルダを作成します。
    例では C ドライブ直下に [tmp] というフォルダを作成しています。

  4. 作成した TSV ファイルを格納します。
    例では [Sample.tsv] という名前で格納しています。

バルクインサートの T-SQL

以下のコードはバルクインサートを実行する sql です。
SSMS にWindows認証でログインし、以下のコードの中で「対象データベース名」と「対象テーブル名」、「TSV ファイル格納パス」を変更してください。
はじめに必ず ROLLBACK モードでバルクインサートを実行してください。
ROLLBACK モードでエラーが発生しないことを確認した後、COMMIT モードでバルクインサートを実行してください。
切り替えフラグの [0], [1] を変更するだけで実行できる sql を作成しております。

DECLARE @IsProduction BIT = 0;
切り替えフラグ: 1 = 本番COMMIT、0 = テストROLLBACK


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;

バルクインサートの SSMS 出力結果具体例







Copyright © LeannaCreate All Rights Reserved.