テーブルに登録されているデータからINSERTスクリプトを作成 [SQLServer]

SQL Serverのテーブルに登録されているデータをもとに、INSERTスクリプトを作成するプログラムを作成します。

C#のプログラムでデータベースへ接続して、指定されたテーブルのデータを挿入するINSERT文のSQLスクリプトを作成し、クリップボードにコピーします。

SQLスクリプトを作成するプログラムを実行するプログラムは、Visual StudioのWindowsフォームアプリケーションで作成します。

データベースへの接続

データベースに接続するために接続文字列(ConnectionString)を作成します。
SQL Server認証を用いて、ユーザーIDとパスワードを指定する場合の接続文字列は、以下のようにします。

Windows認証を用いて接続文字列を作成する場合は、以下のようにします。

serverName: サーバー名
databaseName: データベース名
userId: ユーザーID
password: パスワード

データベース(SQL Server)に接続するために、System.Data.SqlClient名前空間にあるSqlConnectionクラスを使用して、コネクションオブジェクトを生成します。

テーブルのデータを取得してDataTableに格納

connection: コネクションオブジェクト(SqlConnection)
sql: テーブルのデータを取得するSQL文字列

テーブルのデータを格納して保持するDataTableクラス(System.Data名前空間)のインスタンスを生成します。(2行目)

SQLコマンドを発行するSqlCommandクラス(System.Data.SqlClient名前空間)のインスタンスを生成します。(5行目)

SqlCommandオブジェクトのConnectionプロパティにコネクションオブジェクトを設定します。(8行目)

SqlCommandオブジェクトのCommandTypeプロパティにSystem.Data名前空間にあるCommandType 列挙型のTextを設定します。(9行目)

SqlCommandオブジェクトのCommandTextプロパティにテーブルのデータを取得するSQL文字列を設定します。(12行目)

DataTableオブジェクトにデータを格納するSqlDataAdapterクラス(System.Data.SqlClient名前空間)のインスタンスを生成します。(15行目)

SqlConnectionクラスのOpenメソッドでコネクションを開きます。(18行目)

SqlDataAdapterオブジェクトのFillメソッドを使用して取得するデータをDataTableオブジェクトに格納します。(21行目)

SqlConnectionクラスのCloseメソッドでコネクションを閉じます。(24行目)

データベースに接続してテーブルのデータを取得してDataTableに保持するクラス

データベースに接続してテーブルのデータを取得してDataTableに保持するクラスのソースコードです。クラスは「DatabaseAccessor」という名前で作成しています。

DataTableからINSERT文のSQLスクリプトを作成

DataTableオブジェクトからINSERT文のSQLスクリプトを作成する処理は、DataTableオブジェクトが持つDataRowオブジェクトを読み込みながら行います。
DataRowオブジェクトには、インサート(挿入)対象のテーブルのレコードのデータがあるので、INSERT文のVALUES句を作成します。
1行ずつINSERT文を作成してもよいのですが、実行時の処理時間等を考え、今回は1回のINSERT文で複数件のレコードを挿入(追加)する形式のSQLを作成します。

1回のINSERT(インサートSQL)で複数行のレコードを一括挿入(追加)する
SQLServerやMySQLなどのデータベースで、テーブルにレコードをINSERT文使用して追加するには、通常は以下のように記述します。 ...

INSERT文のSQLスクリプトを作成するクラス

INSERT文のSQLスクリプトを作成するクラスのソースコードです。クラスは「InsertSqlScriptMaker」という名前で作成しています。

1回のINSERT文で複数件のレコードを挿入(追加)する場合は、SQL Serverの仕様として1000レコードまでという制限がありますので、1000レコードずつINSERT文が作成されるようにします。
上記のクラスのMakeSqlメソッドでは、DataTableが保持しているすべての行を1000レコードずつに区切って、INSERT文で挿入(追加)するSQL文字列を返します。
例えば、「ID」と「STRING」と「NUMBER」という列を持つ「TEST_TABLE」というテーブルがある場合は、以下のようなSQLが生成されます。

実行プログラムサンプル

「INSERT文のSQLスクリプトを作成するクラス」を使用してSQLを生成するためのUI(ユーザーインターフェース)を持つプログラムを作成します。

VisualStudioでWindowsフォームアプリケーションのプロジェクトを作成します。

Windowsフォームアプリケーションのプロジェクト(ソリューション)を作成する。[C#]
Visual StudioでC#のWindowsフォームアプリケーションのプロジェクト(ソリューション)を作成する方法を記載します。 ...

ユーザーインターフェース

フォームには、サーバー名やデータベース名などの接続に関する情報を入力するコントロールと、取得するデータを制御する情報を入力するコントロールを配置します。

SQL Serverのテーブルに登録されているデータからINSERTスクリプトを作成するサンプルプログラムのフォームデザイン

サーバー名: textBox1
データベース名: textBox2
ユーザーID: textBox3
パスワード: textBox4
スキーマ名: textBox5
テーブル名: textBox6
WHERE: textBox7
ORDER: textBox8

button1のクリックイベントで、SQLスクリプトを生成します。

ソースコード

フォームに記述するソースコードになります。
ボタン(button1)がクリックされた時のイベント処理を実装します。

生成したSQL文字列は、クリップボードにコピーし、メッセージをダイアログボックスで表示します。

プログラムの実行

プロジェクトをビルドしてプログラムを実行するとフォームが表示されますので、SQLスクリプトの作成に実行に必要な情報をテキストボックスに入力します。

SQL Serverのテーブルに登録されているデータからINSERTスクリプトを作成するサンプルプログラムのフォームを実行

テキストボックスに接続情報等を入力してボタンをクリックすると、INSERT文のSQLスクリプトが生成されてクリップボードに設定されます。

テーブルのバックアップスクリプトの生成や、別環境のデータベースにデータを移行する際には使えると思います。