sqlcmdユーティリティでSQLServerのテーブルをCSVファイルとして出力する方法
Linux環境からsqlcmdを利用してテーブルのデータを抽出する方法を解説
本記事ではSQLServerのユーティリティコマンドであるsqlcmdを利用して、Windowsサーバ上に構築しているSQLServerのテーブルをCSVファイルとして出力する手順について説明します。なお、本記事で利用する環境はLinux(Ubuntu 20.04)となります。
sqlcmdとは何か
sqlcmdとはSQLServerに用意されているユーティリティコマンドです。sqlcmdユーティリティを使用することにより、CLI上で対象のSQLServerに対してSQLを実行して結果を取得することが可能となります。詳細については以下のドキュメントを確認していただければと思います。
https://docs.microsoft.com/ja-jp/sql/tools/sqlcmd-utility
SQLCMDでSQLServerのデータを出力してみよう!
私事ですが以前、Google Cloud Platform(GCP)で構築しているデータ分析基盤上のデータレイク(Cloud Storage)に対して、オンプレで運用している業務システムのDB(SQLServer)のテーブル上のデータをCSV形式でファイル出力を行い、データ連携をする必要がありました。
その際にどうすればSQLServerのデータをCloud Storage(GCS)に連携できるかがわからず、色々と調べた経緯がありました。ちなみにSQLServerは社内ネットワークの環境にあったため、SQLServerから直接GCPにデータ連携する方法が方法がなく試行錯誤していました。
そんな状態でしたが、色々と調べていたら、社内にプロキシ経由でインターネットに出られるサーバがあったので、SQLServer上のテーブルデータをCSVにしてそのサーバに出力し、そこからgsutilでCloud Storageにアップロードできないかを考えたところ、どうやら実現できそうだったのですぐに取り掛かり、なんとか実現することに成功しました。その時に実施した手順等を整理して、本記事を書いてみました。
sqlcmdユーティリティでSQLServerのテーブルデータを簡単に出力
繰り返しになりますが、SQLServerには”sqlcmd”というユーティリティコマンドがあります。ただ、今回はLinux環境(Ubuntu)からSQLServerに対してコマンドを実行するため、Linux環境用のユーティリティが必要になります。私はSQLServerについてはあまり知識がないので、
「もしかしてWindows用のユーティリティしかないんじゃないのか、、」
などと思いましたが、Microsoft社の公式ドキュメントを漁ってみたところ、Linux用のユーティリティがすぐに見つかりました。
https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-setup-tools?view=sql-server-ver15
本記事については上記の記事を参考にしているので、詳細な内容については上記のMicrosoft公式のドキュメントを確認いただけると幸いです。
sqlcmdのインストール方法について
以下の手順をもとにLinux環境(Ubuntu 20.04を利用)にmssql-toolsをインストールすることで、sqlcmdを利用してSQLServerに直接、SQLを実行できるようになります。具体的な手順については以下の通りとなります。
パブリックリポジトリのキーをインポート
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
リポジトリの登録
curl https://packages.microsoft.com/config/ubuntu/20.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list
unixODBC開発者パッケージを使用してインストールコマンドを実行
sudo apt-get update sudo apt-get install mssql-tools unixodbc-dev
※最新バージョンの mssql-tools に更新するには以下のコマンドを実行
sudo apt-get update sudo apt-get install mssql-tools
sqlcmdの使い方
sqlcmdユーティリティのインストールが完了したら、実際にSQLServerが構築されているサーバに対して接続し、SQLを実行してその実行結果をCSVファイルで出力してみましょう。
/opt/mssql-tools/bin/sqlcmd -S [インスタンス名] -U [ユーザー名] -P [パスワード] -d [データベース名] -i [実行するSQLファイルのパス] -s, -W -o [出力ファイル名]
上記のコマンドを実行すると、SQL実行結果がファイルとして出力されます。
cronでスケジューリングしておけば定期的にファイルが自動で出力されるので、自動化が必要でしたらcronを使うのがおススメです。
データ基盤構築等の用途に利用する場合については、ここからさらにGCPのCloud Storageのようなオブジェクトストレージにファイルをアップロードするためには、gsutil cpなどのコマンドを利用する必要があるかと思いますが今回は一旦、ここまでとしたいと思います。
また、本記事で記載しているsqlcmdについては恐らくシェルスクリプトと組み合わせて利用するケースが多いかと思います。シェルスクリプトについては特に本記事では触れないので、もしご興味があればこちらの本について目を通しておくと、一通りのお作法は身に付くかと思います。
新しいシェルプログラミングの教科書
1日1問、半年以内に習得 シェル・ワンライナー160本ノック