(Yüzlerce) tablonun bir sunucudan diğerine (SSMS ile) kopyalanması


27

Bir sunucudan diğerine kopyalamak zorunda olduğum birkaç yüz (şu anda 466, ama giderek büyüyen) tablolarım var.

Bunu daha önce hiç yapmak zorunda kalmamıştım, bu yüzden nasıl yaklaşacağından emin değilim. Tüm tablolar aynı biçimdedir:Cart<Eight character customer number>

Bu, bütün bu Cart<Number>masaları bir Cartsmasaya birleştirdiğim daha büyük bir projenin parçası ama bu tamamen farklı bir soru.

Tüm bu tabloları kopyalamak için kullanabileceğim en iyi yöntem var mı? Eğer yardımcı olursa, her iki sunucudaki veritabanı adları aynıdır. Daha önce de söylediğim gibi, sahesabım var, böylece A'dan B'ye veriyi almak için ne gerekiyorsa yapabilirim. Her iki sunucu da aynı sunucu grubunda.


Yanıtlar:


21

SQL Server Management Studio'nun "Verileri Ver" görevini kullanabilirsiniz. SSMS'de veritabanına sağ tıklayın, Görevler'i ve ardından "Verileri Ver" i seçin. Dizinleri kendiniz yeniden oluşturmanız gerekmesine rağmen, tabloları bir sunucudan diğerine kopyalamanıza izin verecek etkileşimli bir sihirbaz başlatır. Sihirbaz geçici bir SSIS paketi oluşturur (tasarruf etmeyi de seçebilirsiniz) ancak nispeten hızlıdır.


4
Aynı Dışa Aktarma görevini ilgileniyorsanız PowerShell ile de yapabilir. Bu eylemi gerçekleştirmek için benzer komut burada benim cevapta: dba.stackexchange.com/a/122149/507
Shawn Melton

neden ithalat / ihracat endeksleri ve bağımlılıkları kopyalamıyor? 466 tablo için endeksleri yeniden oluşturmak çok zor olmaz mıydı?
Vini

@Vini, ayrıca dizinleri kopyalamanıza izin veren Scriptler Oluşturma sihirbazını da kullanabilirsiniz (dizinleri kopyalamanıza izin veren bir komut dosyası düzgün bir şekilde oluşturup oluşturmadığını bilmiyorum.) - Her zaman RedGate SQL Karşılaştırma kullandım.
Aaron Bertrand

@AaronBertrand: Tamam. Ben de aynı soruyu sordum. Fakat tarih saatini aldığımda da küçük tarih saatine çevrildi
Vini

23

Burada, her bir yönde, yeterli ayrıcalıklara, harmanlama uyumluluğuna ve veri erişimine olanak sağlayan, yalnızca bağlantılı bir sunucuya ihtiyaç duyan hızlı ve kirli bir yaklaşım var. Hedef bağlantılı sunucuda yürütülecek dinamik SQL'i üretmek için bunu kaynak bağlantılı sunucuda çalıştırın.

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

Bunu test edip küçük değişiklikler yaparken kolayca yeniden çalıştırılabilmesi için komut dosyası yazılabilecek bir şey istiyorsanız, cevabımı burada kontrol edin:

Bir Veritabanından başka bir betiğe veri alma

Bu cevap SqlBulkCopy, .NET sınıfını kullanan bir SQLCLR saklı yordamını kullanarak açıklar . Bu saklı yordamın kullanılması, tabloların arasında dolaşan bir imleçle yapılabilir. Bu, işlemin kolay bir şekilde düzenlenmesine ve yeni tabloların WHEREhesaplanmasına ya da imleç sorgusundaki bir koşulla bir veya daha fazla tablonun kolayca hariç tutulmasına izin verir .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.