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

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

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

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


PowershellからSQL Serverのインスタンスを生成してTransferTextメソッドを実行し、SQL ServerのテーブルにCSVファイルのデータをインポートします。

コードの流れ

STEP.1
接続文字列を設定する
接続文字列を設定します。
今回はSQL Server接続で接続するので、接続先のサーバ名、データベース名、ユーザ名、パスワードをここで指定します。
STEP.2
BULK INSERTのクエリを用意する
BULK INSERTのクエリを用意します。
BULK INSERTはcsvなどのデータを、SQL Serverのテーブルにインポートできるコマンドです。
STEP.3
SQL Serverのデータベースファイルに接続する
SQL Serverのデータベースファイルに接続します。
STEP.4
BULK INSERTコマンドを実行する
BULK INSERTコマンドを実行します。
STEP.5
SQL Serverとの接続を閉じる
SQL Serverとの接続を閉じます。

CSVファイルとSQL Serverのデータベース・テーブルの例

SQL CSVファイル

今回は下のCSVファイルを用意しました。

データが10件存在しています。

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

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

「tbl_test」のテーブルに10件データが存在しています。

このテーブルに、先ほどのCSVファイルのデータをインポートします。

インポートした結果は下のとおりです。

CSVファイルのデータが追加されています。

PowerShellのコード(例)

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

# インポート先のテーブル名を取得する
$tableName = "tbl_test"

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

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

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

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

# BULK INSERTのクエリを用意する
$query = @"
BULK INSERT $tableName
FROM '$csvFileName'
WITH
(
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n',
    FIRSTROW = 2
)
"@

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

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

# BULK INSERTを実行する
$command.ExecuteNonQuery() | Out-Null

# SQL Serverとの接続を閉じる
$connection.Close()

注目すべきコード①

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

# 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\0009\"

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

コードの説明

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

注目すべきコード③

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

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

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

コードの説明

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

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

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

注目すべきコード④

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

# BULK INSERTのクエリを用意する
$query = @"
BULK INSERT $tableName
FROM '$csvFileName'
WITH
(
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n',
    FIRSTROW = 2
)
"@

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

コードの説明

以上のコードは、BULK INSERTを実行するためのSQL文を用意して、そのSQL文をSqlCommandメソッドに渡してSqlCommandオブジェクトを生成するコードです。

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

コードの詳細

23行目のコードにある「@」は、SQL文が複数行にわたる文字列を定義するための「@」です。

SQL文が複数行に渡る場合、最初に「@」を付けて、最後に「@」を記述して閉じます。(32行目)

24行目はBULK INSERTを実行するために、BULK INSERTの文字列を記述し、その後にCSVファイルのデータをインポートする先のテーブル名を指定します。

25行目では、FROM句の後にCSVファイルを指定します。

26行目ではBULK INSERTコマンドのオプションを指定するために必要なWITH句です。

28行目から30行目のコードは、BULK INSERTのオプションを指定しています。

28行目の「FIELDTERMINATOR」オプションは、CSVファイルのデータがカンマ区切りであることを認識させるオプションです。

29行目の「ROWTERMINATOR」オプションは、改行が「\n」の文字であることを認識させるオプションです。

30行目の「FIRSTROW」オプションは、CSVファイルのデータを読み込む開始行の位置を指定するオプションです。

35行目では、SqlCommandオブジェクトを生成しています。

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

注目すべきコード⑤

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

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

コードの説明

以上のコードは、PowerShellがデータベースに接続する処理のコードです。

注目すべきコード⑥

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

# BULK INSERTを実行する
$command.ExecuteNonQuery() | Out-Null

コードの説明

以上のコードは、ExecuteNonQueryメソッドを実行してBULKINSERTを実行する処理のコードです。

注目すべきコード⑦

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

# SQL Serverとの接続を閉じる
$connection.Close()

コードの説明

以上のコードは、SQL Serverとの接続を閉じる処理のコードです。

動作確認

CSVファイルとSQL Serverのデータベースファイルの例」をご覧ください。

最後に

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

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

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

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

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

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