この記事では、SQL ServerのテーブルデータをCSVファイルにエクスポートする方法についてご説明します。
【動画】SQL ServerのテーブルデータをCSVファイルにエクスポートする実際の動き
本題に入る前に、まずは次の動画をご覧ください。
PowershellからSQL Serverのデータベースに接続してデータを取得し、そのデータをCSVファイルにエクスポートしています。
コードの流れ
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週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。