Kopiowanie (setek) tabel z jednego serwera na inny (za pomocą SSMS)

27

Mam kilkaset (obecnie 466, ale wciąż rosnących) tabel, które muszę skopiować z jednego serwera na drugi.

Nigdy wcześniej nie musiałem tego robić, więc nie jestem pewien, jak do tego podejść. Wszystkie tabele mają ten sam format:Cart<Eight character customer number>

Jest to część większego projektu, w którym łączę wszystkie te Cart<Number>tabele w jeden Cartsstół, ale to zupełnie inne pytanie.

Czy ktoś ma metodę najlepszych praktyk, której mogę użyć do skopiowania wszystkich tych tabel? Nazwy baz danych na obu serwerach są takie same, jeśli to pomaga. I jak powiedziałem wcześniej, mam sakonto, dzięki czemu mogę zrobić wszystko, co konieczne, aby uzyskać dane od A do B. Oba serwery również należą do tej samej farmy serwerów.

410_Gon
źródło
2
Prawdopodobnie interesujące dba.stackexchange.com/questions/30473/…
billinkc

Odpowiedzi:

21

Możesz użyć zadania „Eksport danych” programu SQL Server Management Studio. Kliknij prawym przyciskiem myszy bazę danych w SSMS, wybierz Zadania, a następnie „Eksportuj dane”. Uruchomi interaktywnego kreatora, który pozwoli skopiować tabele z jednego serwera na drugi, chociaż będziesz musiał samodzielnie odtworzyć indeksy. Kreator tworzy tymczasowy pakiet SSIS (chociaż można go również zapisać) i jest stosunkowo szybki.

Alex
źródło
4
W razie zainteresowania można również wykonać to samo zadanie eksportu za pomocą programu PowerShell. Podobny skrypt do wykonania tej akcji znajduje się w mojej odpowiedzi tutaj: dba.stackexchange.com/a/122149/507
Shawn Melton
dlaczego import / eksport nie kopiuje wskaźników i zależności? czy nie byłoby zbyt trudno odtworzyć indeksy dla 466 tabel?
Vini,
@ Vini można również użyć kreatora Generuj skrypty, który pozwala kopiować indeksy (nie wiem jednak, czy niezawodnie generuje skrypt w odpowiedniej kolejności zależności - zawsze używałem do tego RedGate SQL Compare).
Aaron Bertrand
@AaronBertrand: OK. Ja też miałem to samo pytanie. Ale kiedy zaimportowałem datetime, również został przekonwertowany na smalldatetime
Vini
23

Oto szybkie i brudne podejście, które wymaga tylko połączonego serwera w każdym kierunku, z wystarczającymi uprawnieniami, kompatybilnością zestawiania i dostępem do danych. Uruchom to na źródłowym serwerze połączonym, aby wygenerować dynamiczny SQL, który zostanie wykonany na docelowym serwerze połączonym.

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;
Aaron Bertrand
źródło
19

Jeśli chcesz, aby skrypt mógł być łatwo ponownie uruchomiony podczas testowania i wprowadzania drobnych zmian, sprawdź moją odpowiedź tutaj:

Importuj dane z jednej bazy danych do innego skryptu

Ta odpowiedź opisuje użycie procedury składowanej SQLCLR, która korzysta z SqlBulkCopyklasy w .NET. Korzystanie z tej procedury składowanej można wykonać za pomocą kursora, który zapętla tabele. Umożliwia to łatwą edycję procesu, a także rozliczanie nowych tabel lub łatwe wykluczenie jednej lub więcej tabel za pomocą WHEREwarunku w zapytaniu kursora.

Solomon Rutzky
źródło