SQLserver BCPコマンドでデータをダンプ/エクスポート | 人生中盤から色々学ぶ(ブ)ログ

人生中盤から色々学ぶ(ブ)ログ

IT、経済、英語、その他今必要だなと思う事を学びつつ、自分用の記録ついでにブログ化。
あん時やっときゃ良かった、をそろそろ終わりにしたい!

bcp こういうものです。

bulk copy program ユーティリティ (bcp) は、Microsoft SQL Server のインスタンスと、ユーザー指定の形式のデータ ファイルとの間でデータの一括コピーを行います。 bcp ユーティリティを使うと、多数の新規行を SQL Server テーブルにインポートしたり、データをテーブルからデータ ファイルにエクスポートしたりできます。 

このコンポーネントには、Windows インストーラー 4.5 と Microsoft ODBC Driver for SQL Server 17 の両方が必要です。

 

 

データのバックアップ、本番環境からテスト環境へのデータコピー、資料として、その他いろいろで使っています。

作業によってはもっといいやり方もあるのですが、テーブル単位に処理する時はお手軽かなと思ってます。

 

 

 

■基本的なコマンドパターン

引数には対象テーブルと接続情報。

outの指定なら指定ファイルへエクスポート、inなら指定ファイルからのインポートです。

-cで文字形式を指定します。-Cで文字コードを指定。

bcp DB名.スキーマ名.テーブル名 out ファイル名 -c -S サーバー名 -U ユーザー名 -P パスワード
bcp DB名.スキーマ名.テーブル名 in   ファイル名 -c -S サーバー名 -U ユーザー名 -P パスワード

 

特に難しい事はなく、あとはテーブル名の分コマンドをどんどん書いていくだけです。

 

 

 

 

■普段使い

テーブル名以外は共通になるパターンが多いと思いますので、

sys.tablesからテーブルの一覧を取得しつつリテラルを足してbcpコマンドを生成する、

という事をよくやります。

 

 

あるいは、テーブル管理一覧をExcelとかに落として、関数で文字を足すなど。

ExpとImpのコマンドを隣列に生成しておけば、抜け漏れ予防に役立つかも知れません。

 

 

先日あるプロジェクトからの依頼でデータ抽出した際には、

テーブルリストを読んでループでbcpを回すバッチを作りました。

(なかなかPowerShellに手が出ません・・・)

 

 

 

 

■入出力形式について

個人的には-n指定でデータのネイティブ (データベース) データ型を使用するのが、

容量/処理速度ともにベターなのかなと考えています。

 

 

というのもOracleでSQLloader使った昔の経験では圧倒的な速度差があったからなのですが。

 

SQLserverではエクスポートは試せたものの、本番相当な感じのデータではインポートが試せておらず。

パフォーマンスの程が余り体感出来ておりません。

 

 

横目で伺ってるプロジェクトでも、システム移行時にデータ変換が必要との事で文字で読める形式を求められていて。

新環境にDB作っていったん丸ごと放り込めば・・・と思うのですが、ディスク容量には限りがありますしね。

 

という訳で、