ニュース&ブログ
【SQL Server】大量のBCPコマンドを自動生成してみよう
投稿日:2025/01/24
はじめに
データベースの管理において、大量のデータのインポートやエクスポートは重要な作業となります。私もお客様から複数のテーブルのデータをエクスポートする作業をご依頼いただくこともあり、その際はSQL ServerのBCP(Bulk Copy Program)を利用します。
ただし、一から膨大な数のBCPコマンドを作成するには大きな工数がかかるため、簡単にBCPコマンドを作成できるクエリと実機検証をご紹介したいと思います。
BCPの概要
まずはBCPコマンドとは何かというはデータのバルクコピーを行うためのコマンドラインユーティリティで、SQL Serverのインストール時に使用することができます。個別でインストールする場合は、こちらから取得してください。
BCPコマンドは以下のような特徴を持っています。
- 大量のデータを一度に処理できるため、従来のINSERT文やSELECT文よりもはるかに高速
- コンマ区切りやタブ区切りなど、さまざまなフォーマットでデータを扱うことが可能
- スクリプトやバッチファイルに組み込めるので自動化が容易
BCPの使用ケース
BCPは、以下のようなシナリオで使用されることが多いです。
- データ移行: 大規模データの移行時にデータを一時的にファイルにエクスポートし、新しいデータベースにインポートする
- バックアップ: 定期的にデータをファイルにエクスポートしてバックアップを取る
- データ分析: データをCSV形式でエクスポートし、Excelや他の分析ツールで利用する
- データのロード: 外部システムから取得したデータをSQL Serverにインポートする
実機検証
まず、SSMSにてBCPコマンドを利用したいデータベースに接続して、以下のクエリを実行します。
DECLARE @FilePath NVARCHAR(256) = 'C:\bcp\'; -- 出力ファイルのパスを指定
DECLARE @ExecutionDate NVARCHAR(8) = CONVERT(NVARCHAR(8), GETDATE(), 112); -- 実行日付を取得
SELECT
'bcp ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) +
' out "' + @FilePath + s.name + '_' + t.name + '_' + @ExecutionDate + '.csv"' +
' -c -t, -T -S ' + @@SERVERNAME + ' -d ' + DB_NAME() +
' > "' + @FilePath + s.name + '_' + t.name + '_' + @ExecutionDate + '.log"' AS BCPCommand
FROM
sys.tables t
JOIN
sys.schemas s ON t.schema_id = s.schema_id;
このクエリによって、BCPコマンドが作成されます。
次に作成したBCPコマンドの1つをコマンドプロンプトから実行してみたいと思います。
bcp [dbo].[customer1] out "C:\bcp\dbo_customer1_20241010.csv" -c -t, -T -S <サーバー名> -d test > "C:\bcp\dbo_customer1_20241010.log"
実行後は任意に指定した出力場所(今回はC:\bcp\)にlogファイルが格納されていることを確認できます。
もちろんcsvファイルと実際のテーブルの結果は一致しています。
BCPでのインポートは上記コマンドの out を in に変更することで実行可能です。
bcp [dbo].[customer1] in "C:\bcp\dbo_customer1_20241010.csv" -c -t, -T -S 202206-075 -d test > "C:\bcp\dbo_customer1_20241010.log"
先程出力したcsvファイルの中身をインポートしたので、件数は4件になっていますね。
まとめ
BCPコマンドを生成するSQLは汎用的に使えるかと思いますが、BCPには多くのオプションがあるためお客様の要件や環境によって調整は必要です。
また、BCPの動作仕様もあるため、そのあたりを意識して利用して頂ければと思います。
中川 智文(2022年入社)
株式会社システムサポート フューチャーイノベーション事業本部 ソリューションサービス事業部所属
Oracle Database, SQL Serverを中心とした案件に従事