あるサーバーから別のサーバーに(数百の)テーブルをコピーする(SSMSを使用)


27

1つのサーバーから別のサーバーにコピーする必要があるテーブルは数百(現在は466ですが、増え続けています)です。

私はこれをする必要がなかったので、どのようにアプローチするのか全くわかりません。すべてのテーブルは同じ形式です。Cart<Eight character customer number>

これは、これらすべてのCart<Number>テーブルを1つのCartsテーブルにマージするより大きなプロジェクトの一部ですが、それはまったく別の質問です。

これらのすべてのテーブルをコピーするために使用できるベストプラクティスの方法はありますか?両方のサーバーのデータベース名は、それが役立つ場合は同じです。先ほど言ったように、saAからBにデータを取得するために必要なことは何でもできるようにアカウントを持っています。両方のサーバーも同じサーバーファームにあります。


回答:


21

SQL Server Management Studioの「データのエクスポート」タスクを使用できます。SSMSでデータベースを右クリックし、[タスク]、[データのエクスポート]の順に選択します。インデックスを自分で再作成する必要がありますが、サーバー間でテーブルをコピーできる対話型ウィザードが起動します。ウィザードは一時的なSSISパッケージを作成し(保存することもできます)、比較的高速です。


4
必要に応じて、PowerShellを介して同じエクスポートタスクを実行することもできます。このアクションを実行するようなスクリプトは、ここに私の答えである:dba.stackexchange.com/a/122149/507
ショーン・メルトン

インポート/エクスポートがインデックスと依存関係をコピーしないのはなぜですか?466個のテーブルのインデックスを再作成するのは難しすぎませんか?
ヴィニ

@Viniでは、Generate Scriptsウィザードも使用できます。このウィザードでは、インデックスをコピーできます(ただし、適切な依存関係の順序で確実にスクリプトを生成するかどうかはわかりませんが、そのためにRedGate SQL Compareを常に使用しています)。
アーロンバートランド

@AaronBertrand:OK。私も同じ質問をしました。私は、インポート時にでも、日時もsmalldatetime型に変換されました
Viniに

23

十分な特権、照合の互換性、およびデータアクセスを有効にして、各方向にリンクサーバーのみを必要とする、迅速で汚いアプローチです。これをソースリンクサーバーで実行して、宛先リンクサーバーで実行される動的SQLを生成します。

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'SELECT * INTO [database].dbo.' + QUOTENAME(name)
  + N' FROM [source_linked_server].[database].dbo.' + QUOTENAME(name) + N';'
FROM sys.tables
WHERE name LIKE N'Cart[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]';

PRINT @sql; -- this will only print 8K, enough to spot check
--EXEC [destination_linked_server].master.sys.sp_executesql @sql;

19

これをテストし、小さな変更を加えるときにスクリプト化できるものを簡単に再実行できるようにしたい場合は、ここで私の答えをチェックしてください:

あるデータベースから別のスクリプトにデータをインポートする

その答えはSqlBulkCopy、.NET のクラスを利用するSQLCLRストアドプロシージャの使用について説明しています。そのストアドプロシージャの使用は、テーブルをループするカーソルで実行できます。これにより、プロセスの簡単な編集と新しいテーブルのアカウンティング、またはWHEREカーソルクエリの条件を介した1つ以上のテーブルの簡単な除外が可能になります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.