SQL Server - スクリプトを生成してテーブルのデータをコピーする方法
SQL Server のテーブルのデータをコピーする方法
開発環境やテスト環境など、環境違いで同じスキーマのデータベースがあって、テーブルのデータをコピーしたいような時ありますよね。
全部テーブルのデータをコピーしたいのであれば、データベースのバックアップファイルをリストアするなどして、データベースごと置き換えるのが早いですね。
時にはテーブルひとつふたつのデーターだけコピーしたい時もあるかもしれません。
そのような、ちょっとコピーしたい時には、SQL Server Management Studio でスクリプトを生成してデータをコピーする方法を覚えておくと便利です。
今回は、コピー元のデータベースで INSERT スクリプトを生成してテーブルのデータをコピーする方法をご紹介します。
SQL Server Management Studio のスクリプトの生成
SQL Server Management Studio のスクリプトの生成機能を使って、データをコピーする INSERT スクリプトを生成します。
以下の例では Test という名前のデータベースの Student と Test テーブルのデータの INSERT スクリプトを生成します。
1. オブジェクトエクスプローラーでデータベースを選択し、右クリックで [タスク] > [スクリプトの生成] を選択します。
2. ウィザードの説明のページが出てくるので [次へ] をクリックします。
3. [オブジェクトの選択] ページが表示されるので、[特定のデータベースオブジェクトの選択] を選びます。
「テーブル」 の横のプラスボタンをクリックしてテーブルの一覧を出し、今回データをコピーしたい Student と Test テーブルにチェックを入れ、[次へ] をクリックします。
4. [スクリプト作成オプションの設定] ページが表示されます。 今回はスクリプトを D:\Temp\CopyData.sql ファイルに出力するようにしました。 そして、[詳細設定]をクリックします。
5. 詳細設定の [スクリプトを作成するデータの種類]のオプションを [データのみ] に設定し、[OK] をクリックします。
今回はコピー先のデータベースに既に同じ名前のテーブルがある前提ですが、コピー先にテーブルがない時は [スキーマとデータ] を選択してください。
6. 先ほどの [スクリプト作成オプションの設定] の画面に戻るので、そこから [次へ] をクリックします。
7. [概要] ページが表示されるので [次へ] をクリックします。
8. [スクリプトの保存またはパブリッシュ] ページが表示され、アクションの実行結果が表示されるので終わったら [完了] をクリックします。
生成された CopyData.sql ファイルを開いてみると、Student と Test テーブルのデータの INSERT ステートメントが生成されています。
Student と Test テーブルには IDENTITY カラムがあるので、データをインサートできるように SET IDENTITY_INSERT の ON/OFF まで追加してくれています。
このスクリプトをコピー先のデータベースで実行します。 データベース名が違う場合は一番上の行の USE の後のデータベース名を変更して実行してください。
これで、コピー元のデータベースの Student と Test テーブルのデータが、コピー先のデータベースの Student と Test テーブルにコピーできました。
スクリプトを生成してテーブルのデータをコピーする際の注意点
この方法は単純に選択したテーブルのデータに対して INSERT ステートメントを生成し、それを実行するだけです。
ですので、挿入しようとするデータが、コピー先のテーブルの制約違反になるようなケースはエラーになります。
例えば、コピー先のテーブルのプライマリーキーなど UNIQUE 制約がついているカラムの値と重複してしまうデータがある場合はエラーになります。
コピー元のデータと全く同じにしたい時は、コピー先のテーブルのレコードを全て削除してからスクリプトを実行すると良いと思います。
また、コピー先のテーブルに外部キーのついているカラムの値が含まれていて、その外部キーが参照しているカラムに挿入しようとしている値がないとエラーになります。
関連するデータはプライマリーキーとなるテーブルから順序を考慮しながら全てコピーするようにしてくださいね。