ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

SQL Serverのbcpコマンドの使い方

SQL Serverに付属しているコマンドラインツールのbcpの使い方について説明します。

bcpコマンドとは?

SQL Serverと一緒にインストールされるコマンドラインツールです。
”bulk copy program”の頭文字を取って、bcpと呼ばれているようです。
docs.microsoft.com

何ができるかというと、bcpコマンドを実行することでデータベースにアクセスしてデータをテキストファイルに出力したり、逆にテキストファイルを元にデータをデータベースに一括登録したりすることができます。

bcpコマンドの構文の確認

まずは、bcpコマンドの構文を確認しましょう。オプションがたくさんありますが、紹介するのは最低限のものにします。気になる方は、公式サイトなどでお調べいただければと思います。

bcp [データベース名].[スキーマ名].[テーブル名] out [ファイルパス] /S [サーバー名] /T /c /t [区切り文字]

オプションの意味はそれぞれ以下の通りです。上記で記載していないオプションも少し紹介します。

オプション 意味
/S このオプションの引数に接続するサーバー名を指定します。既定のインスタンスであればこのオプションは指定しないでも問題ありません。
/T このオプションを付与すると、Windows認証でSQL Serverへ接続します。SQL Server認証で接続するのであれば、このオプションは指定しません。
/c このオプションを付与すると、出力ファイルはテキスト形式で扱われます。
/t このオプションの引数に、カラムの区切り文字を指定することができます。たとえば、","を指定することでカンマ区切りになります。ちなみに、デフォルトの区切り文字はタブになります。
/U SQL Server認証の場合に使用するユーザー名を指定します。
/P SQL Server認証の場合に使用するパスワードを指定します。ただしコマンドライン上にパスワードを指定するのはあまりよくありません。指定しなかった場合でも、コマンド実行後にパスワードを聞かれるのでそこで入力すれば問題ありません(その場合は入力したパスワードはマスクされて表示されるので安全です)。

ちなみに、オプションは大文字小文字を意識して入力する必要があります。小文字と大文字で意味が異なるので注意してください。

サンプルテーブル

今回は、以下のようなサンプルテーブルで確認していきます。

f:id:mr_star:20210916193326p:plain
サンプルで使用する社員テーブル

bcpコマンドでデータをエクスポート

それでは、bcpコマンドでデータをエクスポートしてみましょう。以下のコマンドで実行します。

bcp sampleDB.dbo.社員 out C:\work\社員テーブル.txt /T /c /t ","
f:id:mr_star:20210916193654p:plain
bcpコマンドエクスポート

以下の通り、指定したディレクトリにファイルがエクスポートできています。中身もデータベースに格納されているものと同じですね。

f:id:mr_star:20210916193814p:plain
bcpコマンドでエクスポートしたファイル
f:id:mr_star:20210916193946p:plain
bcpコマンドでエクスポートしたファイルの中身

bcpコマンドでデータをインポート

今度は逆に、bcpコマンドでデータをインポートしてみましょう。
まずは、同じように構文を確認しますがエクスポートとほぼ同じです。"out"が"in"に変わっているだけです。

bcp [データベース名].[スキーマ名].[テーブル名] in [ファイルパス] /S [サーバー名] /T /c /t [区切り文字]


それでは、実際にデータをインポートしてみましょう。さきほどエクスポートしたファイルを使用したいので、まずは社員テーブルを削除してしまいます。

f:id:mr_star:20210916194622p:plain
サンプルで使用する社員テーブル(データなし)

以下のコマンドで、bcpコマンドで先ほどエクスポートしたファイルのデータをインポートします。

bcp sampleDB.dbo.社員 in C:\work\社員テーブル.txt /T /c /t ","
f:id:mr_star:20210916194743p:plain
bcpコマンドインポート

データがしっかりとインポートできたか確認してみましょう。削除前と同じデータが復元できました。

f:id:mr_star:20210916194903p:plain
bcpコマンドでインポートできたか確認

補足

bcpコマンドでデータをエクスポートするときの補足を一つ確認したいと思います。上記で見たエクスポートの方法では、テーブルの全レコードが取得されます。場合によっては、必要なデータだけ取得したいときがあると思います。実は、クエリを書いて条件を指定してデータをエクスポートできるのです。

以下のように実行します。先ほどの社員テーブルから、社員番号が4または5のデータのみを取得し、「社員テーブル_2.txt」に出力します。先ほど見たエクスポートの構文と異なるところは、テーブル名を記載していた箇所をSELECT文に、"out"を"queryout"に変更しているところです。

bcp "SELECT * FROM sampleDB.dbo.社員 WHERE 社員番号 = 4 OR 社員番号 = 5" queryout C:\work\社員テーブル_2.txt /T /c /t ","

指定したファイル名でエクスポートされていて、中身は上記で指定したクエリで抽出できています。

f:id:mr_star:20210916201049p:plain
bcpコマンドエクスポート②
f:id:mr_star:20210916201139p:plain
bcpコマンドでエクスポートしたファイルの中身②

おわりに

いかがでしたでしょうか。普段は、SSMSを基本的に使っていたりすればこのようなコマンドが存在することを知らない人もいるのではないかと思います。

以前あるプロジェクトで検証環境で発生した障害を再現するために、データをローカルに持っていくためにbcpコマンドを使ったことがあります。
データベースのフルバックアップだとデータが大きすぎるし、変更したくないデータなども変わってしまうので、そういうときにテーブル単位でデータをインポート、エクスポートできるのでとても便利です。

使ったことがない人は、是非一度試してみてはいかがでしょうか。
今回も最後までお読みいただきありがとうございました。この辺で失礼いたします。