【PowerShell】SQL ServerのテーブルデータをCSVファイルにエクスポートするには

この記事では、SQL ServerのテーブルデータをCSVファイルにエクスポートする方法についてご説明します。

【動画】SQL ServerのテーブルデータをCSVファイルにエクスポートする実際の動き

本題に入る前に、まずは次の動画をご覧ください。


PowershellからSQL Serverのデータベースに接続してデータを取得し、そのデータをCSVファイルにエクスポートしています。

コードの流れ

STEP.1
SQL Serverのデータベースに接続するための接続文字列を設定する
SQL Serverのデータベースに接続するための接続文字列を設定します。
STEP.2
SqlConnectionオブジェクトを生成する
SqlConnectionオブジェクトを生成します。
STEP.3
SELECT文を設定する
SELECT文を設定します。
STEP.4
SqlCommandオブジェクトを生成する
SqlCommandオブジェクトを生成します。
STEP.5
SQL Serverに接続する
SQL Serverに接続します。
STEP.6
エクスポートするデータを取得するSELECT文を実行する
エクスポートするデータを取得するSELECT文を実行します。
STEP.7
取得したデータをデータテーブルに格納する
取得したデータをデータテーブルに格納します。
STEP.8
データテーブルに格納されているデータをCSV形式の文字列に変換する
データテーブルに格納されているデータをCSV形式の文字列に変換します。
STEP.9
データテーブルのデータをCSVファイルに書き出す
データテーブルのデータをCSVファイルに書き出します。
STEP.10
Accessのデータベースファイルへの接続を閉じる
Accessのデータベースファイルへの接続を閉じます。

SQL Serverのデータベースとテーブルの例

今回は下のSQL Serverのデータベースとテーブルを用意しました。

SQL Serverのデータベース「CS_01」に「tbl_test」のテーブルが存在しています。

今回はこの「tbl_test」のテーブルデータをCSVファイルにエクスポートします。

エクスポートしたCSVファイルは下のとおりです。

「tbl_test」のテーブルデータがCSVファイルに出力されています。

PowerShellのコード(例)

# 必要なアセンブリをロードする
Add-Type -AssemblyName System.Data

# フォルダパスを設定する
$folderPath = "C:\work\10_勉強\18_PowerShell\0010\"

# 取得したデータを出力するCSVファイル名を設定する
$csvFileName = $folderPath + "data.csv"

# エクスポートするデータのテーブル名を設定する
$tableName = "tbl_test"

# SQL Serverの接続情報を設定する
$serverName = "(LocalDB)\MSSQLLocalDB"      # 接続するサーバ名
$databaseName = "CS_01"                     # 接続するデータベース名
$userId = "test_user"                       # ログインユーザ名
$password = "pass_str1"                     # ログインユーザのパスワード

# 接続文字列を設定する(SQL Server認証の場合)
$connectionString = "Server=$serverName;Database=$databaseName;User Id=$userId;Password=$password;"

# SqlConnectionオブジェクトを生成する
$conn = New-Object System.Data.SqlClient.SqlConnection($connectionString)

# SELECT文を設定する
$query = "SELECT * FROM [$tableName]"

# SqlCommandオブジェクトを生成する
$cmd = New-Object System.Data.SqlClient.SqlCommand($query, $conn)

# SQL Serverに接続する
$conn.Open()

# SELECT文を実行し、結果をSqlDataReaderに格納する
$reader = $cmd.ExecuteReader()

# DataTableオブジェクトのインスタンスを生成する
$dt = New-Object System.Data.DataTable

# SqlDataReaderの内容をDataTableにロードする
$dt.Load($reader)

# DataTableの内容をCSV形式の文字列に変換する
$csvData = $dt | ConvertTo-Csv -NoTypeInformation -Delimiter ","

# UTF-8エンコーディングのインスタンスを生成する
$utf8 = New-Object System.Text.UTF8Encoding $false

# CSVデータをUTF-8形式でファイルに書き出す
[System.IO.File]::WriteAllLines($csvFileName, $csvData, $utf8)

# データベース接続を閉じる
$conn.Close()

注目すべきコード①

最初に見て頂きたいのは2行目から8行目です。

# SQL Serverの接続情報を設定する
$serverName = "(LocalDB)\MSSQLLocalDB"      # 接続するサーバ名
$databaseName = "CS_01"                     # 接続するデータベース名
$userId = "test_user"                       # ログインユーザ名
$password = "pass_str1"                     # ログインユーザのパスワード

コードの説明

以上のコードは、SQL Serverの接続情報を設定するコードです。

今回はSQL Server接続で接続するので、接続先のサーバ名、データベース名、ユーザ名、パスワードをここで指定します。

注目すべきコード②

次に見て頂きたいのは8行目から14行目です。

# エクスポートするデータのテーブル名を設定する
$tableName = "tbl_test"

# フォルダパスを設定する
$folderPath = "C:\work\10_勉強\18_PowerShell\0010\"

# 取得したデータを出力するCSVファイル名を設定する
$csvFileName = $folderPath + "data.csv"

コードの説明

以上のコードは、SQL Serverのインポート先のテーブル名とCSVファイルのフルパスを設定するコードです。

注目すべきコード③

次に見て頂きたいのは17行目から20行目です。

# 接続文字列を設定する(SQL Server認証の場合)
$connectionString = "Server=$serverName;Database=$databaseName;User Id=$userId;Password=$password;"

# SqlConnectionオブジェクトを生成する
$conn = New-Object System.Data.SqlClient.SqlConnection($connectionString)

コードの説明

以上のコードは、接続文字列を作成してSqlConnectionオブジェクトを生成するコードです。

SQL Serverのデータベースに接続するための接続情報をconnectionオブジェクトに格納します。

このコードにより、どのSQL Serverのデータベースに接続するのか、PowerShellが認識できるようになります。

注目すべきコード④

次に見て頂きたいのは23行目から26行目です。

# SELECT文を設定する
$query = "SELECT * FROM [$tableName]"

# SqlCommandオブジェクトを生成する
$cmd = New-Object System.Data.SqlClient.SqlCommand($query, $conn)

コードの説明

以上のコードは、SELECT文を取得し、そのSELECT文をSqlCommandメソッドに渡してSqlCommandオブジェクトを生成するコードです。

SqlCommandオブジェクトを生成することで、SELECT文を実行することができるようになります。

注目すべきコード⑤

次に見て頂きたいのは29行目から32行目です。

# SQL Serverに接続する
$conn.Open()

# SELECT文を実行し、結果をSqlDataReaderに格納する
$reader = $cmd.ExecuteReader()

コードの説明

以上のコードは、PowerShellがSQL Serverに接続してSELECT文を実行する処理のコードです。

SELECT文を実行して取得したデータは、readerに格納されます。

注目すべきコード⑥

次に見て頂きたいのは35行目から38行目です。

# DataTableオブジェクトのインスタンスを生成する
$dt = New-Object System.Data.DataTable

# SqlDataReaderの内容をDataTableにロードする
$dt.Load($reader)

コードの説明

以上のコードは、DataTableオブジェクトのインスタンスを生成し、readerの値をデータテーブルにロードする処理のコードです。

注目すべきコード⑦

次に見て頂きたいのは41行目です。

# DataTableの内容をCSV形式の文字列に変換する
$csvData = $dt | ConvertTo-Csv -NoTypeInformation -Delimiter ","

コードの説明

以上のコードは、データテーブルのデータを、CSV形式の文字列に変換する処理のコードです。

CSV形式の文字列に変換するにはConvertTo-Csvコマンドレットを使います。

今回はデータをカンマ区切りにしたいので、「Delimiter」パラメータに「,」(カンマ)を指定しています。

また、ConvertTo-Csvコマンドレットが生成する型情報の行は不要なので「NoTypeInformation」パラメータを指定して型情報の行を除外します。

注目すべきコード⑧

次に見て頂きたいのは44行目から47行目です。

# UTF-8エンコーディングのインスタンスを生成する
$utf8 = New-Object System.Text.UTF8Encoding $false

# CSVデータをUTF-8形式でファイルに書き出す
[System.IO.File]::WriteAllLines($csvFileName, $csvData, $utf8)

コードの説明

以上のコードは、UTF-8エンコーディングのインスタンスを生成し、UTF-8形式でファイルに書き出す処理のコードです。

CSVファイルへの出力は、今回UTF-8形式で行います。

UTF-8形式で出力するには、まずはUTF-8エンコーディングのインスタンスを生成します。

UTF-8エンコーディングのインスタンスの生成は、New-Objectコマンドレットを使います。

New-Objectコマンドレットの引数に「System.Text.UTF8Encoding」クラスを指定することでUTF-8エンコーディングのインスタンスが生成されます。

また、$falseはBOMを使用しないことを示しています。(今回はBOMは使用しない)

以上でUTF-8エンコーディングのインスタンスが生成できたら、WriteAllLinesメソッドを実行してCSVファイルにデータを出力します。

今回使用するWriteAllLinesメソッドは、.NET FrameworkのSystem.IO.Fileクラスに定義されている静的(またはクラス)メソッドです。

WriteAllLinesメソッドの引数には、出力するCSVファイル、CSVファイルに出力するデータ(今回はテーブルデータ)、そしてエンコーディング(今回は先ほどのUTF-8エンコーディングのインスタンス)の3つを指定します。

注目すべきコード⑨

次に見て頂きたいのは50行目です。

# データベース接続を閉じる
$conn.Close()

以上のコードは、PowerShellがAccessのデータベースファイルとの接続を閉じる処理のコードです。

動作確認

SQL Serverのデータベースとテーブルの例」をご覧ください。

最後に

この記事では、SQL ServerのテーブルデータをCSVファイルにエクスポートする方法についてご説明します。

SQL ServerのテーブルデータをCSVファイルにエクスポートしたい場合は本記事を参考にして頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら