web-dev-qa-db-ja.com

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

あるサーバーから別のサーバーにコピーしなければならないテーブルが数百(現在は466、ただし増え続ける)あります。

これまでにこれを行う必要がなかったので、それにどのように取り組むかはまったくわかりません。すべてのテーブルは同じ形式です:Cart<Eight character customer number>

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

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

27
Der Kommissar

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

21
Alex

これは、十分な権限、照合の互換性、およびデータアクセスが有効になっている、各方向のリンクサーバーのみを必要とする迅速でダーティなアプローチです。これをソースリンクサーバーで実行して、宛先リンクサーバーで実行される動的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;
23
Aaron Bertrand

BCP OUTおよびBULK INSERT INTOを宛先データベースに使用できます。 このスクリプト を使用できます

SSIS(データのインポート/エクスポート)を使用してデータ転送を行う も使用できます。

19
Kin Shah

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

1つのデータベースから別のスクリプトにデータをインポート

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

19
Solomon Rutzky