SQL Serverで1つのデータベースから別のデータベースにテーブルをコピーする


325

fooというデータベースとbarというデータベースがあります。データベースfooからデータベースbarに(データとすべて)移動したいtblFoobarというfooのテーブルがあります。これを行うSQLステートメントは何ですか?

回答:


208

SQL Serverでは?と同じデータベースサーバー上で?3部構成の名前を使用します。

INSERT INTO bar..tblFoobar( *fieldlist* )
SELECT *fieldlist* FROM foo..tblFoobar

これはデータを移動するだけです。テーブル定義(および権限やインデックスなどの他の属性)を移動する場合は、別のことを行う必要があります。


また、テーブルの権限を個別に設定する必要があると思います。
ケン・レイ

1
ID挿入も行う必要がある場合は、データインポートウィザードにそのオプションがあります^^-他の回答を参照
Clarence Liu

13
@TahaRehmanSiddiqui:それは質問に答えるので;)彼はデータベースサーバー間でそれをコピーする方法を尋ねませんでした。しかし、グーグルが最初の結果としてそれを与えるので、その答えを探しているほとんどの人はここで終わります:)
Maarten Kieft 2014

1
@RyanBはい、それは許可されています。
エイミーB

1
@Tom OPとこの質問に来る多くの人々は、ツールではなく「SQLステートメント」を探しています。
エイミーB

535

SQL Server Management Studioの「データのインポート」タスク(DB名を右クリックしてからタスク)は、これのほとんどを行います。データをコピーするデータベースから実行します。

テーブルが存在しない場合は作成されますが、おそらくインデックスなどを再作成する必要があります。テーブルが存在する場合は、デフォルトで新しいデータが追加されますが、それを調整して(マッピングを編集)、既存のデータをすべて削除できます。

私はいつもこれを使っており、かなりうまくいきます。


1
このオプションが見つからないようです。ここに特定のバージョンがありますか?
Nerrve 2012

35
一般的に、これがより良い答えであるとは言えません。たとえば、スクリプト内から自動化を呼び出すことはできません。ところで、作者は特に「..SQLステートメント..」を求めました。しかし、もちろんそれは素晴らしい答えですが、より良いものではありません;)
グリズリー

3
著者は「(データとすべて)」を移動するように求めました。だから私はこの答えがそれをしたことを望んだ。テーブルは作成されますが、キーやインデックスは作成されません。そのため、SQLの回答に比べてそれほど改善はありません。
unubar 2014年

WHEREデータのインポートタスクを使用して条件を指定することはできますか?私はそうする方法を見つけることができませんでした。
2014年

1
はい、これもここで述べたように正しい方法ですidentityforeign key参照は宛先データベースで削除されます、解決策はありますか?
shaijut 2015年

106

これはうまくいくはずです:

SELECT * 
INTO DestinationDB..MyDestinationTable 
FROM SourceDB..MySourceTable 

制約、デフォルト、またはインデックスコピーされません。作成されたテーブルには、クラスター化インデックスがありません

別の方法として:

INSERT INTO DestinationDB..MyDestinationTable 
SELECT * FROM SourceDB..MySourceTable

宛先テーブルが存在し、空の場合。


最初にベーステーブルの構造(フィールドとデータ)をコピーしてから、パッチスクリプトを適用して権限、インデックス、制約、および拡張プロパティを作成した場合、問題はありませんか?
leoinfo 2008年

4
これは、SQL Server 2008でID列の値を挿入しません。これは、列リストを使用し、宛先テーブルに対してIDENTITY_INSERTがONの場合にのみ許可されます。
Lucas Wilson-Richter

@ルーカス-あなたは「半分」正しいです:)。ただし、最初のSQLステートメントは、ID列内の値を含むすべてのデータをコピーします。言ったように、制約は作成されません。ただし、すべてのデータが移動されたら、ソースDBで簡単にスクリプト化し、宛先DBに適用できます。
leoinfo 2012年

2番目のバージョン(INSERT INTO...)はOracleで私に役立ちました。
vapcguy

2つのデータベースが異なる接続文字列を持つまったく異なるサーバー上にある場合、これは機能しますか?そうでない場合、それをどのように処理しますか?
アレクサンダーライアンバゲット2017

46

テーブルが1つだけの場合、必要なのは

  • スクリプトテーブルの定義
  • 別のデータベースに新しいテーブルを作成する
  • ルール、インデックス、権限などを更新する
  • データのインポート(例へのいくつかの挿入はすでに上記に示されています)

考慮しなければならないことの1つは、将来他のオブジェクトを移行するなどの他の更新です。ソーステーブルと宛先テーブルの名前が同じではないことに注意してください。つまり、ビュー、ストアドプロシージャなどの依存オブジェクトがある場合は、変更を加える必要があります。

問題がなければ手動で移動できる1つまたは複数のオブジェクト。ただし、更新がいくつかある場合は、サードパーティの比較ツールが非常に役立ちます。現在、スキーマの移行にApexSQL Diffを使用していますが、他のツールで問題が発生することはありません。


23
  1. スクリプトのcreate table管理スタジオでは、テーブルを作成するために、バーでそのスクリプトを実行します。(オブジェクトエクスプローラーでテーブルを右クリックし、テーブルをスクリプトとして、作成先...)

  2. INSERT bar.[schema].table SELECT * FROM foo.[schema].table


1
私はこのアプローチが好きです。ただし、ID列がある場合は、*を選択しても機能しません。列名を明示的にリストする必要があります。SET IDENTITY_INSERT TblName ONその場合も行う必要があります。
JeremyWeir

16

SQL Serverスクリプト生成ウィザードを使用して、以下を実行できるSQLスクリプトの作成をガイドすることもできます。

  • テーブルスキーマをコピーする
  • 制約(ID、デフォルト値など)
  • テーブル内のデータ
  • 必要に応じて他の多くのオプション

ここに示すスクリーンショットを使用したSQL Server 2008の良いワークフロー例。


?!?「どのようにこのGETは171分の508やった投票とライアンの『10月11日'11 23:41で』ライアンさんがこれまでに13を得る唯一の答え:上記の私のコメントを参照してください唯一の答え答えはOPのQだと。完全にので、それこれらのシナリオを処理します(ところで、OPはqから除外しませんでした)。a)ID(非常に一般的)、b)制約、c)トリガー、d)インデックス、e)権限、d)スキーマとデータのコピー(ヒント:オペレーションの「(データとすべて)」の「すべて」の部分はスキーマも意味します。)およびe)オペレーションが指定した「SQLステートメント」を生成します。そうではない。」
トム・

1
注:この回答は、行数が「過剰」ではなく(つまり、ルックアップ/小さなトランザクションテーブル)、「大きな」列の値がない場合にのみ実用的です。それらの場合、私はテーブル(列属性とサブオブジェクトを含む)作成用のスクリプトを生成するためにRyanの回答を使用し、David Bの「Insert Into Select」の回答を使用します。(ライアンのAの代わりに)単一のテーブルの場合、SSMS、オブジェクトエクスプローラー、右クリックテーブル、スクリプトテーブルとして、作成先を使用することもできますが、まず、ツール、オプション、SQL Serverオブジェクトエクスプローラー、スクリプトオプションが必要に応じて設定します。
トム・

9

あなたはこの方法で行くことができます:(一般的な例)

insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers

また、挿入句を挿入するために列名も生成する必要がある場合は、以下を使用します。

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName')

結果をコピーしてクエリウィンドウに貼り付け、テーブルの列名を表します。これでもID列は除外されます。

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName') and is_identity = 0

行をコピーするスクリプトは、データベースが同じ場所に属している場合に機能することを覚えておいてください。


あなたはこれを試すことができます。

select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>

両方のDBが同じサーバーにある場合、サーバー名はオプションです。


1

既存のテーブルがあり、データのみをコピーしたい場合は、このクエリを試すことができます。

Destination_Existing_Tblに挿入し、col1、col2 FROM Source_Tblを選択します


0

データをコピー

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.