別のデータベースのテーブルからデータをコピー (テーブル構造はコピーできない)
異なるサーバー、もしくは違うDBからいくつかのテーブル内のデータをコピーしたい場合。
自分の開発用と、共有の開発サーバーがあったとする。
共有サーバーから、更新されたテーブルを取得したいとき、
一番簡単な方法は、ウィザードを使う方法である。
データのインポート、エクスポートウィザードを使う
この方法はテーブルのカラムに設定したインクリメント設定が消えます。
インデックスやインクリメントの設定を残したいときはスクリプトでコピーすることをお勧めします。
データベースを右クリック => タスク => データのインポート、データのエクスポート
のどれかを選べばいい。
このやり方を紹介している記事はたくさんある。
https://spiral.hatenadiary.org/entry/20110815/1313422182
方法
- コピー元のテーブルを右クリック、タスク – データのエクスポート
インポートでもいいが次の画面でコピー元を入力しなくて済む。
2. この画面はデータのインポート、エクスポート、データベースのコピーどれも同じなので、次へ
3. SQLserverならこれを選んでおけばよい。
4. データのコピー元、コピー先のサーバー名とデータベースを選択
サーバー名はIPでも可。サーバー名を指定しないとデータベースは選べない。
認証は普段使っているほうでいい。
5. 次の画面で1部または複数のビューのコピーを選択
6. テーブルの一覧が出てくるので、コピーしたいデータのあるテーブルを選択して、次へ
7. 特に問題なければそのまま実行を選ぶ。
マッピングの編集で、コピー元のデータをコピー先のデータに追加するか、一度コピー先のデータを消してから、コピー元のデータを追加できるかを選択できる。
データベースのコピーという項目もあるので、DBの内容をそのままコピーしたい場合はそれを使うといい。
それよりも、一度コピー元のDBのバックアップファイルを作成してから、新規にDBを作成して、復元をするのがおすすめである。
SQLを打つ
コピー先のDBのテーブル名を気を付ければ、以下のSQLでinsertできる。
同じテーブル名でコピーしたいときは、あらかじめコピー先のテーブルを右クリックで削除しておく。
SELECT * INTO [コピー先DB名].dbo.[テーブル名]
FROM
[コピー元DB名].dbo.[テーブル名]
ただインサートで全部挿入するだけである。
違うDBからデータをコピーしたいとき(カラム名が違う場合)
カラム名が違う場合など、これもSQLを打ってデータを挿入する。
INSERT INTO [コピー先DB名].dbo.[テーブル名] (列名1, 列名2, 列名3, …)
SELECT 列名1, 列名2, 列名3, … FROM [コピー元DB名].dbo.[テーブル名]
selectのサブクエリはかっこを付けなくてもよいらしい。
参考
https://www.ipentec.com/document/sql-table-data-move
SQLの作成が面倒であれば、
コピーしたいテーブルを右クリックー>テーブルをスクリプト化ー>新規作成
テーブルのコピーなら、新規作成でどれかを選べば、テーブル作成のSQLが出力される。これをコピー先のデータベースのところでSQLを実行する。
またこの方法はデータをコピーできない。
なので、コピーする場合、
テーブルのスクリプト化のなかの、データのコピーなら、データ登録で、INSERT文が出てくる。
データの更新なら、データ更新で、UPDATE文が出てくるので、コピー先のデータベースで、実行すればいい。