【SQLServer】SELECT結果をCSVで出力する(Powershell編)

SQL
スポンサーリンク

SQLServerでSELECTした結果をCSVで出力する方法は、いろいろありますが今回はpowershellで作成してみました。sqlcmdとバッチを組み合わせた方法は別記事にありますのでそちらを参照してください。

SQLServerでSELECT結果をCSVで出力する
SQLServerでSELECT結果をCSVで出力する。BCPなどいろいろな方法があるがあるが今回はsqlcmdでの出力方法を調べました。

CSVを出力するプログラムの前提条件

前提条件として任意のフォルダ(今回はC:\test配下)に呼び出し用のbatファイルとps1ファイルを置きます。今回はデータベースの断片化率を取得したいと思います。

#SELECT結果をCSV出力する インデックス断片化率一覧出力
#SqlConnectionStringBuilderでDBに接続
[System.Data.SqlClient.SqlConnectionStringBuilder]$connectionString = New-Object -TypeName System.Data.SqlClient.SqlConnectionStringBuilder;
# インスタンス名を記載(xxxx\xxxxなど)
[object]$connectionString['Data Source'] = "xxxxxx";
# データベース名を記載(ここではAdventureWorks2019)
[object]$connectionString['Initial Catalog'] = "AdventureWorks2019";
#Windows認証
[object]$ConnectionString['Integrated Security'] = $true

#csv出力するファイル名
$csvReport = "csv_Report.csv"

#取得したいSQLを以下に書く。ここではインデックスの断片化率取得↓↓↓↓  
#以下は自分で取得したSELECT文を書けばOK  
[string]$sql = 
"SELECT 
OBJECT_NAME(ind.OBJECT_ID) AS テーブル名,
ind.name AS インデックス名,
indexstats.index_type_desc AS インデックスタイプ,
indexstats.avg_fragmentation_in_percent AS インデックス断片化率,
ins.レコード件数

FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats
INNER JOIN sys.indexes ind 
ON ind.object_id = indexstats.object_id
AND ind.index_id = indexstats.index_id
INNER JOIN
(select o.name as テーブル名, i.rows as レコード件数
from sysindexes i, sysobjects o
where
o.xtype = 'U'
and o.id = i.id
and i.indid < 2
)ins ON OBJECT_NAME(ind.OBJECT_ID) = ins.テーブル名
ORDER BY レコード件数 DESC"
#↑↑↑↑↑↑↑↑↑↑ここまで

# SQL実行結果を一時格納
[System.Data.DataTable]$resultsDataTable = New-Object System.Data.DataTable;

# SQLConnection、SQLCommandを設定
[System.Data.SQLClient.SQLConnection]$sqlConnection = New-Object System.Data.SQLClient.SQLConnection($connectionString);
[System.Data.SQLClient.SQLCommand]$sqlCommand = New-Object System.Data.SQLClient.SQLCommand($sql, $sqlConnection);

# データベースへ接続
[object]$sqlConnection.Open();

# DataTableにデータを格納
[object]$resultsDataTable.Load($sqlCommand.ExecuteReader());

# CSV形式で標準出力
[object]$resultsDataTable | export-csv $csvReport -Encoding default -NoTypeInformation

# データベース接続解除
[object]$sqlConnection.Close();
rem test.ps1を格納したフォルダに移動
PUSHD C:\test
rem test.ps1を実行
powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1

上記test.ps1ファイルとExec.batを同じフォルダに格納してExec.batを実行すればOKです。[string]$sql = 以降のSQLは取得したい任意のSQLに変更すればそのまま使えます。

コメント

タイトルとURLをコピーしました