日常の業務で、Excel やシステムから出力した CSV(カンマ区切りのテキストファイル)を SQL Server に取り込みたいという場面はよくあります。
しかし、
- 「SSMS(SQL Server Management Studio)を毎回起動して SQL を手で実行するのは大変…」
- 「IT に詳しくないので、できれば簡単に処理したい…」
という声も多いでしょう。
そこで本記事では、SQL Server の BULK INSERT(バルクインサート) という機能を使って、
CSV を高速に取り込む方法を解説します。さらに簡単に実行できるように ダブルクリックだけで 取り込めるファイルを作成するところまで丁寧にステップを踏んで解説します。
SQL Server を活用するには何がともあれデータをサーバーに保管しないことには始まりません。
SQL Server 活用の第一歩としてこの知識を是非参考にしてみて下さい。
まず知っておくべき基本用語
読み進める前に、このあと登場する主要用語を短く整理しておきます。
CSV / テキストファイル
Excel から「名前を付けて保存」で書き出せる形式の1つ。
中身はただのテキストで、次のように「カンマ」で区切られています。
SaleDate,Product,Quantity,Amount
2025-11-01,WidgetA,10,1250
2025-11-02,WidgetB,5,800
テーブル
SQL Server のデータの置き場。Excel の「テーブル」のようなものです。
各列の列名が決まっていて、データは1行ずつ入っている単純な表形式と理解しておけばOKです。
BULK INSERT
CSV やテキストファイルを 高速に SQL Server へ取り込むためのコマンドです。
通常のSQLコマンドの INSERT 文で1行ずつ追加するより圧倒的に高速です。
SSMS(SQL Server Management Studio)
SQL Server の管理ツールです。プログラムの開発ツールのような画面で一般のユーザーには少しとっつきにくいかもしれません。
この記事では SSMSを使わずに SQL Server にコマンドを発する方法を紹介していきます。
sqlcmd.exe
SQLコマンドをコマンドラインから実行できる便利なツールです。
SSMS を起動しなくても .bat ファイルから SQL を実行できます。
これを使うことで「ダブルクリックで取り込み」が実現できます。
準備(環境とファイル)
この記事の手順を実行するために必要なものをまとめます。
SQL Server
会社のサーバ or 自分の PC に SQL Server がインストールされていること。
接続情報は次のような形です:
- サーバ名(例:MY-SERVER\SQLEXPRESS)
- データベース名(例:MyDatabase)
もし不明なら 社内のDB管理者に確認してください。
BULK INSERT を実行する権限
通常は SQL Server の管理者(DBA)に設定してもらいます。
「取り込み用の権限をください」と言えば通じるでしょう。
sqlcmd.exe(SSMS がなくても利用可)
Windows で SQL Server を利用すると通常自動的にインストールされます。
おおよその場所は以下のどれかです。ご自分の環境で探してみて下さい。
C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\NNN\Tools\Binn\sqlcmd.exe
C:\Program Files\Microsoft SQL Server\NNN\Tools\Binn\sqlcmd.exe
取り込む CSV ファイルの準備
この記事では例として次の CSV ファイルを用意します。
- ファイル名:sales_2025-11.csv
- フォルダ:C:\data\
内容(UTF-8 / Shift_JIS どちらでも可):
SaleDate,Product,Quantity,Amount
2025-11-01,WidgetA,10,1250
2025-11-02,WidgetB,5,800
ファイルのエンコード(重要)
文字化けの原因で一番多いのが 文字コードの違い です。
- Windows版 Excel → 基本的に Shift_JIS
- Web システム → UTF-8 のことが多い
BULK INSERT では後で CODEPAGE オプションで指定できます。
テキストファイルの文字コード(エンコード)はメモ帳でファイルを開くことで確認することが可能です。

取り込み先テーブルを作る(手順)
CSV を取り込むためには、まず 受け皿となるテーブル を作る必要があります。
ここではサンプル CSV の内容に合わせて、次のようなテーブルを作成します。
- 日付(SaleDate)
- 商品名(Product)
- 個数(Quantity)
- 金額(Amount)
テーブル作成の基本ルール
テーブル作成には次の3つさえ押さえれば大丈夫です。
- 列名(カラム名)→ CSV の項目に合わせる
- データ型 → 日付、文字列、数値などを指定
- NULL を許可するか → データが必ず入る場合は NOT NULL、迷ったら NULL でOK
サンプル SQL(このまま使えます)
以下の SQLコマンド を実行すると、上記で解説した内容の取り込み用テーブルが作られます。
コマンドの中に列名が含まれているのが分かると思います。
IF OBJECT_ID('dbo.SalesImport', 'U') IS NOT NULL
DROP TABLE dbo.SalesImport;
CREATE TABLE dbo.SalesImport (
SaleDate date NULL,
Product nvarchar(100) NULL,
Quantity int NULL,
Amount decimal(10,2) NULL
);
実行方法
SSMS で次の手順で実行して下さい。
- 新しいクエリ
- 上の SQL を貼り付ける
- 実行ボタン
BULK INSERT の基本 — コマンドの構成とオプション
ここでは、CSV をテーブルに読み込むための BULK INSERT の基本構成を説明します。
BULK INSERT の基本形
BULK INSERT <テーブル名>
FROM '<ファイルパス>'
WITH (
FIELDTERMINATOR = '<区切り文字>',
ROWTERMINATOR = '<行区切り>',
FIRSTROW = <開始行番号>,
CODEPAGE = '<文字コード>',
TABLOCK
);
CSV を取り込むときは、この形を少し書き換えるだけでOKです。
よく使うオプション
FIELDTERMINATOR
区切り文字を指定します。CSV なら カンマ 区切りなので下記のように設定します。
FIELDTERMINATOR = ','
ROWTERMINATOR
行末の区切り。`\n’ は改行文字を表しています。基本的にはこれでOKです。
ROWTERMINATOR = '\n'
FIRSTROW
データ本体の始まる行を指定します。例えば、1行目に「列名」が入っている場合は 2行目からがデータなので、「2」 を指定します。
FIRSTROW = 2
CODEPAGE
文字コードを指定を指定します。
- ANSI(Shift_JIS)の場合 → CODEPAGE = ‘ACP’
- UTF-8 の場合 → CODEPAGE = ‘65001’
文字コードはWindows標準のメモ帳でファイルを開くと、ウィンドウ右下に表示されますので、ここで確認してみて下さい。
図
TABLOCK
取り込み速度が速くなるため設定しておきましょう。
サンプル:CSV を読み込む BULK INSERT
BULK INSERT dbo.SalesImport
FROM 'C:\data\sales_2025-11.csv'
WITH (
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
CODEPAGE = '65001', -- UTF-8 の場合(Shift_JISなら 'ACP')
TABLOCK
);
SELECT COUNT(*) AS ImportedRows FROM dbo.SalesImport;
失敗したときの対処(よくある3つ)
パスが見つからない
ファイルがサービスアカウントから参照できない場合があります。
C:\data\ のようなローカルパスに置くのが安全です。
文字化け
CODEPAGE が違う可能性大。
データ型エラー
CSV に空白や余計な記号があるケースが多い。
Excel で開いて不要な列を削除しておくと改善する可能性があります。
よくあるデータ形式の取り込み例(実践)
BULK INSERT は CSV だけでなく、さまざまな形式に対応します。
ここではよく使われるパターンをいくつか紹介します。
カンマ区切り(標準的な CSV)
最もよく使うパターンです。
BULK INSERT dbo.SalesImport
FROM 'C:\data\sales.csv'
WITH (
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
);
タブ区切り(TSV)
システム出力でよく使われます。
FIELDTERMINATOR = '\t'
ヘッダなし CSV
FIRSTROW = 1
固定長ファイル(上級者向け)
固定長は設定が少し複雑なので、通常は SSIS や PowerShell を使うことも多いです。
本記事では詳細説明は割愛し、CSV を前提とします。
sqlcmd.exe とは — SSMS を使わず SQL を実行する道具
日常業務で SQL を少し触る程度のユーザーにとって、SSMS(SQL Server Management Studio)を使いこなすのは負担が大きいと思います。
ファイルをクリックするだけで処理できれば、とても便利になります。
そこで登場するのが sqlcmd.exe です。
sqlcmd.exe の役割
- SQL 文をファイルから読み込み
- SQL Server に対して実行し
- 結果を画面やログに出力する
SSMS の「実行」ボタンを押す代わりに、コマンドラインから SQL を流してくれるツールです。
sqlcmd.exe はどこにある?(探し方)
多くの環境では次のいずれかにあります:
C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\*\Tools\Binn\sqlcmd.exe
C:\Program Files\Microsoft SQL Server\*\Tools\Binn\sqlcmd.exe
探し方:
- エクスプローラで C:\Program Files\Microsoft SQL Server を開く
- 「sqlcmd」で検索
- 表示されたパスをコピーしておく
sqlcmd.exe の基本構文
sqlcmd -S <サーバ名> -d <データベース名> -E -i <SQLファイル>
-S:サーバ名
例:MY-SERVER\SQLEXPRESS
-d:データベース名
例:MyDatabase
-E:Windows認証
会社のPCはほぼこれでOKです。会社のネットワークにログインする際の認証をそのまま利用します。
SQL 認証
SQL Server 上でユーザーを作成している場合は、以下のようにしてユーザー名、パスワードを直接記入して接続します。
sqlcmd -S サーバー名 -U ユーザー名 -P パスワード
-i:実行したい SQL ファイル
例:import.sql
BULK INSERT を SQL ファイルとして保存する
csv の取り込み処理を毎回書くのは面倒なので、
SQL 文をファイルとして保存し、sqlcmd.exe に渡すようにします。
SQL ファイルを作る
例として次のファイルを作ります:
- ファイル名:import_sales.sql
- 保存場所:C:\import\
以下の中身をメモ帳に張り付けて、UTF-8(BOM なし推奨)で保存して下さい。
PRINT '=== BULK INSERT START ===';
TRUNCATE TABLE dbo.SalesImport;
BULK INSERT dbo.SalesImport
FROM 'C:\data\sales_2025-11.csv'
WITH (
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
CODEPAGE = '65001',
TABLOCK
);
PRINT '=== BULK INSERT END ===';
SELECT COUNT(*) AS ImportedRows FROM dbo.SalesImport;
TRUNCATE TABLE はテーブルを空にする
毎回取り込み前にテーブルを空にするために TRUNCATE TABLE コマンドを実行するようになっています。
過去データを残したい場合はこのコマンド行は削除してください。
SQL ファイルでよくあるトラブル
文字コードが原因でエラー
メモ帳ではなく VS Code を使うとより安定します。
「UTF-8 (BOMなし)」を推奨
ファイルパスに全角が含まれている
可能な限り避ける(BULK INSERT が苦手)
バッチファイル(.bat)を作る — ダブルクリックで自動実行
いよいよ、クリックだけで取り込めるようにします。
バッチファイルとは?(かんたん説明)
Windows のコマンドをまとめて書いておき、ファイルを ダブルクリックするだけで実行できる仕組みです。
バッチファイルを作成する(手順)
以下のファイルを作ります:
- ファイル名:import_sales.bat
- 場所:C:\import\
メモ帳に以下の中身を張り付けてファイルを保存して下さい。
@echo off
echo === SALES DATA IMPORT START ===
"C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\sqlcmd.exe" ^
-S MY-SERVER\SQLEXPRESS ^
-d MyDatabase ^
-E ^
-i "C:\import\import_sales.sql"
echo === SALES DATA IMPORT END ===
pause
ファイルのパスに日本語が含まれている場合は、バッチファイルは文字コードが ANSI(Shift JIS) でないと正しく動作しません。
この場合は図のようにメモ帳で名前を付けて保存する際に、文字コード(エンコード)を指定してから保存するようにしてください。

ポイント解説
sqlcmd.exe のパス
前章で調べた場所を正確に貼り付けること。
-S:サーバ名
会社の SQL Server のサーバ名に変更。
pause
実行結果がすぐ閉じないようにするため。
完成!CSV をダブルクリックで取り込む流れ
実運用では以下の流れになります。
毎日やる作業(ユーザー視点)
ファイルサーバに届いた CSV を
- C:\data\sales_2025-11.csv に置く
- import_sales.bat を ダブルクリック
- 「取り込み完了」と表示される
- SQL Server のテーブルにデータが入っている
これでSSMSを開く必要はありません。
失敗したときにまず確認すること
- CSV のファイル名が変わっていないか
- CSV のエンコード
- sqlcmd.exe のパス
- サーバに接続できているか
現場で多いトラブルの多くは ファイル名の変更 と パスの間違い です。
発展編:ファイル名を自動で切り替える(応用)
実務では「日付入りの CSV」がよく流れてきます。
例:
sales_2025-11.csv
sales_2025-12.csv
毎回 SQL を書き換えるのは大変なので、バッチ側で最新ファイルを自動判定することも可能です。
簡易例:
for %%F in (C:\data\sales_*.csv) do set TARGET=%%F
sqlcmd -S ... -i import_sales.sql -v FILE="%TARGET%"
SQL ファイルでは
BULK INSERT dbo.SalesImport
FROM '$(FILE)'
WITH (...)
とすればOKです。
まとめ
SQL Server を使うならまずデータを保管することから始める必要があります。
この記事のように BULK INSERT コマンドをバッチファイルと sqlcmd.exe を使って呼び出すことで、一般のユーザーでも簡単にデータを SQL Server に保管することが可能です。
データが SQL Server に入ったら Excel の Power Query から簡単にデータを取り出すことができ、マウス操作でデータ処理も簡単にできてしまいます。
SQL Server + Excel の強力なタッグを活用するためにも、大量なデータを SQL Server に保管する仕組みを構築する必要があります。
このような仕組みを構築するために、今回の記事を是非参考にしてこれまでのデータ処理業務を改革していってみて下さい。

