はじめに
SQL ServerのSELECT結果をCSVで出力する方法は複数ありますが、今回は PowerShellを使った方法をご紹介します。 バッチファイルと sqlcmd を組み合わせた方法については、別記事にて解説していますので、そちらもぜひご参照ください。sqlcmdとバッチを組み合わせた方法は別記事にありますのでそちらを参照してください。
📦 今回の目的
- SQL Serverに接続して、インデックスの断片化率を取得
- PowerShellでSELECT結果をCSV形式で保存
- バッチファイルで自動実行できるように構成
🧩 前提条件
- 任意のフォルダ(例:
C:\test)に以下の2ファイルを配置test.ps1(PowerShellスクリプト)Exec.bat(呼び出し用バッチファイル)
- Windows認証でSQL Serverに接続
🧠 PowerShellスクリプトの内容(test.ps1)
# 接続情報の設定
$connectionString = New-Object System.Data.SqlClient.SqlConnectionStringBuilder
$connectionString["Data Source"] = "xxxxxx" # インスタンス名
$connectionString["Initial Catalog"] = "AdventureWorks2019" # データベース名
$connectionString["Integrated Security"] = $true # Windows認証
# 出力ファイル名
$csvReport = "csv_Report.csv"
# 実行するSQL(インデックス断片化率取得)
$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実行とCSV出力
$resultsDataTable = New-Object System.Data.DataTable
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$sqlCommand = New-Object System.Data.SqlClient.SqlCommand($sql, $sqlConnection)
$sqlConnection.Open()
$resultsDataTable.Load($sqlCommand.ExecuteReader())
$resultsDataTable | Export-Csv $csvReport -Encoding Default -NoTypeInformation
$sqlConnection.Close()
🖥️ バッチファイルの内容(Exec.bat)
PUSHD C:\test
powershell -NoProfile -ExecutionPolicy Unrestricted .\test.ps1✅ 実行方法
C:\testフォルダにtest.ps1とExec.batを配置Exec.batをダブルクリックで実行csv_Report.csvが同フォルダに出力される
🔄 SQLのカスタマイズ
$sql = @" ... "@ の中身を任意のSELECT文に変更すれば、どんなクエリでもCSV出力可能です。 たとえば、売上データやユーザー一覧など、用途に応じて柔軟に対応できます。
✍️ まとめ
PowerShellを使えば、SQL Serverのデータを簡単にCSV出力でき、バッチ化によって自動化も可能です。 特に、インデックスの断片化率などの定期的なメンテナンス情報を取得する用途におすすめです。



コメント