SSIS'den tamamen rahatsız olan benim.
Kaynak tablolarda kimlik sütunu olmadığında
- hedef sunucuda boş bir veritabanı oluşturmak
- hedef sunucudaki kaynak sunucuya bağlı bir sunucu oluşturma
- select * into ... ifadeleri oluşturmak için kaynak veritabanında aşağıdaki komut dosyasını çalıştırın
- oluşturulan veritabanını hedef veritabanından çalıştır
- birincil veritabanını, dizinleri, tetikleyicileri, işlevleri ve yordamları kaynak veritabanından komut dosyası
- bu nesneleri oluşturulan komut dosyasıyla oluştur
Şimdi T-SQL Select * into ... ifadeleri üretecek
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
Bu, kopyalanacak her tablo için bir satır oluşturur
select * into [Table1] from [linked_server].[source_db].[dbo].[Table1];
Tabloların kimlik sütunları içermesi durumunda, kimlik özelliği ve birincil anahtarlar da dahil olmak üzere tabloları kodlarım.
Bu durumda bağlantılı bir sunucu kullanarak ... select ... içine insert kullanmıyorum, çünkü bu toplu bir teknik değildir. [Bu SO soru 1 benzer bazı PowerShell komut dosyaları üzerinde çalışıyorum , ancak hala hata işleme üzerinde çalışıyorum. Gerçekten büyük tablolar, SQLBulkCopy aracılığıyla veritabanına gönderilmeden önce bir tablonun tamamı belleğe yüklendiği için bellek hatalarına neden olabilir.
Endekslerin rekreasyonu vb. Yukarıdaki duruma benzer. Bu sefer birincil anahtarların yeniden oluşturulmasını atlayabilirim.