私はSSISに完全に不快な人です。
ソーステーブルにID列がない場合
- ターゲットサーバーに空のデータベースを作成します
- ターゲットサーバー上のソースサーバーへのリンクサーバーを作成する
- ソースデータベースで以下のスクリプトを実行して、select * into ...ステートメントを生成します
- 生成されたスクリプトをターゲットデータベースから実行する
- ソースデータベースからの主キー、インデックス、トリガー、関数、およびプロシージャのスクリプト
- 生成されたスクリプトによってこれらのオブジェクトを作成します
次に、Select * into ...ステートメントを生成するT-SQL
SET NOCOUNT ON
declare @name sysname
declare @sql varchar(255)
declare db_cursor cursor for
select name from sys.tables order by 1
open db_cursor
fetch next from db_cursor into @name
while @@FETCH_STATUS = 0
begin
Set @sql = 'select * into [' + @name + '] from [linked_server].[source_db].[dbo].[' + @name + '];'
print @sql
fetch next from db_cursor into @name
end
close db_cursor
deallocate db_cursor
これにより、次のようにコピーする各テーブルの行が生成されます
select * into [Table1] from [linked_server].[source_db].[dbo].[Table1];
テーブルにID列が含まれている場合、IDプロパティと主キーを含むテーブルのスクリプトを作成します。
この場合はリンクサーバーを使用しますが、これは一括手法ではないため、insert into ... select ...を使用しません。私は[このSOの質問1と同様のPowerShellスクリプトに取り組んでいますが、まだエラー処理に取り組んでいます。SQLBulkCopyを介してデータベースに送信される前に、テーブル全体がメモリにロードされるため、本当に大きなテーブルはメモリ不足エラーを引き起こす可能性があります。
インデックスの再作成などは、上記の場合と同様です。今回は、主キーの再作成をスキップできます。