【SQLServer】SQLサーバのデータをCSVでブチ抜く

Windows プログラミング

【SQLServer】SQLサーバのデータをCSVでブチ抜く

あぁ、今日は雨ですか。
もう少し冬が続いて欲しいのだが。。。
今年は全然スキー場にいけていないのよ。

時差勤務も飽きてやめてしまったし。
(みなさん時差勤務を始めたようで、逆に混み始めたwwww

さてさて、
今日は技術ネタ。

お客から〇〇〇なデータが欲しい。とか、よく言われますよね。
ただ、頻度が高いわけでもなく、システムに新しく機能を追加するまでもない。
そんな時のために、ある程度定型化した出力ツールを簡単に作成しておこうという話。

今回は、コマンドプロンプトからの出力方法とPowerShellからの出力方法。

では、早速。


コマンドプロンプトで

コマンドプロンプトって普段はあまり使わないのですが、開発する上ではスケジューラに起動させてみたり。ある程度は需要があるのです。
ではパパっと。

まずはバッチファイルを作成。
中身を以下のように作成。
SqlCommandExample.bat

@ECHO OFF 

SQLCMD -S servername -U username -P password -d databasename -i SqlCommandExample.sql -s, -W -h -1 -o SqlCommandExample.csv

単純にSQLCMDを呼び出している感じですね。
指定データベースに対してSqlCommandExample.sqlを実行し、結果をSqlCommandExample.csvに記録するという内容。

SQLファイルの作成
SqlCommandExample.sql

SET NOCOUNT ON 

SELECT * 
  FROM mst_account

SET NOCOUNT OFF

SQL文の前後にあるのは、件数出力の有無を指定している。
アカウントマスタの全件を取得するという簡単な内容。

さて、SqlCommandExample.batをダブルクリックして実行。
SqlCommandExample.csvが作成されますね。

出力結果

1,ほげ氏名_1,ほげしめい1,hoge_mail_address_1@hogehoge.net,000-0000-0001,2020-03-10 10:22:01.0000000,2020-03-10 10:22:01.0000000,0,1900-01-01 00:00:00.0000000
2,ほげ氏名_2,ほげしめい2,hoge_mail_address_2@hogehoge.net,000-0000-0002,2020-03-10 10:22:01.0000000,2020-03-10 10:22:01.0000000,0,1900-01-01 00:00:00.0000000
3,ほげ氏名_3,ほげしめい3,hoge_mail_address_3@hogehoge.net,000-0000-0003,2020-03-10 10:22:01.0000000,2020-03-10 10:22:01.0000000,0,1900-01-01 00:00:00.0000000
4,ほげ氏名_4,ほげしめい4,hoge_mail_address_4@hogehoge.net,000-0000-0004,2020-03-10 10:22:01.0000000,2020-03-10 10:22:01.0000000,0,1900-01-01 00:00:00.0000000
・
・
略

いたって普通なCSV。
ただ、ヘッダがないので、何かに取り込む際は注意せねば。


PowerShellで

でました。
PowerShell。
コマンドプロンプトの後継ですね。
当然のことながら、コマンドプロンプトより使えます。

プログラムチックに作るなら、PowerShellでしょう。

シェルスクリプトファイルを作成。
PowerShellExample.ps1

#SQL接続関連
#ConnectionStringオブジェクト
[object]$ConnectionString = New-Object -TypeName System.Data.SqlClient.SqlConnectionStringBuilder

#サーバ名、データベース名、認証方式
[object]$ConnectionString['Data Source'] = "servername"
[object]$ConnectionString['Initial Catalog'] = "databasename"

#今回はOS認証。
#接続先の認証方式に合わせて変更すべし
[object]$ConnectionString['Integrated Security'] = "TRUE"

#実行SQL
[string]$SQL = "SELECT * FROM mst_account"

#DataTableオブジェクト
[object]$resultsDataTable = New-Object System.Data.DataTable

#SQLServer接続初期化
[object]$SqlConnection = New-Object System.Data.SQLClient.SQLConnection($ConnectionString)
[object]$SqlCommand = New-Object System.Data.SQLClient.SQLCommand($SQL, $SqlConnection)
[object]$SqlConnection.Open()

#SQLを実行
[object]$resultsDataTable.Load($SqlCommand.ExecuteReader())

#接続を終了
[object]$SqlConnection.Close()

#保存
[object]$resultsDataTable | export-csv PowerShellExample.csv -Encoding default -NoTypeInformation

Oh…ごらんのとおり、記述が長い。
ただし、かなり拡張性を考慮して作成できるため、汎用性は高い。
ちゃんと後のことを考えて作れる人には有利ですよこれ。

出力結果

"id","name","name_kana","mail_address","tel_no","create_date","update_date","is_delete","delete_date"
"1","ほげ氏名_1","ほげしめい1","hoge_mail_address_1@hogehoge.net","000-0000-0001","2020/03/10 10:22:01","2020/03/10 10:22:01","False","1900/01/01 0:00:00"
"2","ほげ氏名_2","ほげしめい2","hoge_mail_address_2@hogehoge.net","000-0000-0002","2020/03/10 10:22:01","2020/03/10 10:22:01","False","1900/01/01 0:00:00"
"3","ほげ氏名_3","ほげしめい3","hoge_mail_address_3@hogehoge.net","000-0000-0003","2020/03/10 10:22:01","2020/03/10 10:22:01","False","1900/01/01 0:00:00"
"4","ほげ氏名_4","ほげしめい4","hoge_mail_address_4@hogehoge.net","000-0000-0004","2020/03/10 10:22:01","2020/03/10 10:22:01","False","1900/01/01 0:00:00"

・
・
・
略

うぅん。
ヘッダの有無とダブルクォーテーションの有無を考慮しないとコマンドプロンプトと同じ内容、とも言えず。


コマンドプロンプトとPowerShell。
どちらを使っても同じことはできる。
PowerShellはフレームワークを使うことができるので便利。
プログラム作るひとはあまり用事ないかもしれん。

コンピュータの仕事をしていると、知見・経験を増やさないと。などと思ってしまう。
知らないと、お客に提案すらできないですものね。
客先で毎度「持ち帰らせていただきます」ではやりとり時間がかかってしまうし。
金額のことは置いといても、可能・不可能ぐらいの回答はするべきでしょう。

前の記事 次の記事