2012-06-13 8 views
39

Mam dwa serwery SQL (obie wersje 2005).Eksportuj dane tabeli z jednego serwera SQL do innego

Chcę migrować kilka tabel z jednego do drugiego.

Próbowałem:

  • Na serwerze źródłowym Mam kliknięciu prawym przyciskiem myszy na bazie danych, wybrane Tasks/Generate scripts. Problem polega na tym, że pod Table/View options nie ma opcji Script data.

  • Następnie użyłem Script Table As/Create script do wygenerowania plików SQL w celu utworzenia tabel na moim serwerze docelowym. Ale wciąż potrzebuję wszystkich danych.

Potem próbowałem za pomocą:

SELECT * 
INTO [destination server].[destination database].[dbo].[destination table] 
FROM [source server].[source database].[dbo].[source table] 

Ale otrzymuję błąd:

obiekt zawiera więcej niż maksymalną liczbę prefiksów. Maksymalna to 2.

Czy ktoś może wskazać mi właściwe rozwiązanie mojego problemu?

+1

można wyświetlać niektóre wygenerowanych sprawozdań podobać ? Czy dodałeś inne serwery jako połączone serwery? –

+0

nie jako serwery połączone. To nie miało sensu, ponieważ oba są mssql2005. Właśnie stworzyłem połączenie. To musi być połączony serwer? – no9

+0

Instrukcja "Into" (która tworzy tabelę i wstawia do niej) obsługuje tylko lokalne tabele. Najpierw musisz utworzyć tabelę, a następnie użyć "wstawić do [serwera docelowego]. [Docelowa baza danych]. [Dbo]. [Tabela docelowa]". – jumxozizi

Odpowiedz

43

Spróbuj tego:

  1. utworzyć tabelę na serwerze docelowym przy użyciu skryptów z etapu

  2. na serwerze docelowym Script Table As/Create Script można następnie wydać oświadczenie T-SQL:

    INSERT INTO dbo.YourTableNameHere 
        SELECT * 
        FROM [SourceServer].[SourceDatabase].dbo.YourTableNameHere 
    

To powinno działać dobrze.

+1

Podoba mi się twoja propozycja. Próbowałem i dostałem. Nie można znaleźć serwera "" w sys.servers. Sprawdź, czy podano poprawną nazwę serwera ... Być może jest to problem, że nazwa serwera źródłowego sinte ma format "NAME \ NAME2"? Ale myślę, że [] powinien rozwiązać ten .... pomysł? – no9

+8

@ no9: przepraszam - oczywiście, aby to zadziałało, musisz [dodać "połączony serwer" między dwoma serwerami] (http://msdn.microsoft.com/en-us/library/ms188279.aspx). –

+1

tak. Ale wyobraź sobie, mam problem z tworzeniem połączonego serwera. Serwer produkcyjny jest skonfigurowany tak, aby zezwalał na połączenia zdalne, ale nadal otrzymuję limit czasu, nawet jeśli używam personifikacji lub bezpośrednio usr/pwd. Ponieważ zarządzanie serwerem nie jest w mojej domenie, niewiele mogę zrobić. Ale udało mi się rozwiązać mój problem w inny sposób. Opublikuje anwser dla zabawy i zaakceptuje twoje odkąd lubię to rozwiązanie. – no9

2

Nie można wybrać serwera źródłowego/docelowego.

Jeśli bazy danych są na tym samym serwerze, można to zrobić:

Jeśli kolumny tabeli są równe, to można to zrobić (w tym celu!):

INSERT INTO [destination database].[dbo].[destination table] 
SELECT * 
FROM [source database].[dbo].[source table] 

Jeśli chcesz w tym celu, po utworzeniu kopii zapasowej/przywracania źródłowej bazy danych. Jeśli chcesz zrobić to częściej, polecam rozpocząć projekt SSIS, w którym definiujesz źródłową bazę danych (możesz wybrać dowolne połączenie na dowolnym serwerze) i utworzyć projekt, w którym przenosisz tam swoje dane. Zobacz więcej informacji tutaj: http://msdn.microsoft.com/en-us/library/ms169917%28v=sql.105%29.aspx

+1

Tak, możesz to zrobić, dodając je jako połączone serwery http://msdn.microsoft.com/en-us/library/ms188279.aspx –

+0

No cóż, sam o tym nie wiedziałem. Pozwól mi to oświecić. W powyższym przypadku nadal rekomenduję projekt SSIS dla tych zadań. – YvesR

+0

SSIS jest trochę przeciążony dla jednorazowej kopii - ale dla regularnych i przyrostowych ładunków też bym to zasugerował! –

1

do kopiowania danych ze źródła do miejsca przeznaczenia:

use <DestinationDatabase> 
select * into <DestinationTable> from <SourceDataBase>.dbo.<SourceTable> 
+0

Mam dwa różne serwery. Gdybym miał tylko jedną, to by działało. – no9

+1

Czy utworzyłeś połączony serwer? Nie wynika z twojego pytania. Następnie dodaj nazwę przed w powyższym zapytaniu (wykonywane na ). –

+0

Nie mogę utworzyć połączonego serwera. Zobacz moją odpowiedź na marc_s anwser – no9

9

Istnieje opcja stół skrypt w Zadania/generowanie skryptów! Tęskniłem za tym na samym początku! Ale możesz tam generować skrypty wstawiania (bardzo dobra funkcja, ale w bardzo nieintuicyjnym miejscu).

Po przejściu do kroku "Ustaw opcje tworzenia skryptów" przejdź do zakładki "Zaawansowane".

Kroki opisane here (zdjęcia mogą zrozumieć, ale piszę w języku łotewskim).

+0

dziękuję Janis. – no9

+0

zapraszamy! :) –

4

Spróbuj użyć serwera SQL Server Import and Export Wizard (w obszarze Zadania -> Eksportuj dane).

Oferuje tworzenie tabel w docelowej bazie danych. Podczas gdy, jak widzieliście, kreator skryptów może tworzyć tylko strukturę tabeli.

+0

Nie ma opcji eksportu danych do bazy danych, z której chcę eksportować tabele. Po prostu: Odłącz, zmniejsz, twórz kopie zapasowe, przywracaj, generuj skrypty ... – no9

+0

Kreator skryptów może również eksportować dane – user763539

+0

@ user763539 - naprawdę? Podczas ostatniego sprawdzania nie było opcji generowania skryptu zawierającego np. Instrukcje 'INSERT'; z pewnością wydaje się być prawdziwe dla [tag: sql-server-2005]. Czy masz link lub referencję? –

4

Jeśli tabele są już tworzone przy użyciu skryptów, to nie ma innego sposobu, aby skopiować dane jest za pomocą polecenia BCP skopiować wszystkie dane z serwera źródłowego do serwera docelowego

Aby wyeksportować tabelę dane w pliku tekstowym na serwerze źródłowym:

bcp <database name>.<schema name>.<table name> OUT C:\FILE.TXT -c -t -T -S <server_name[ \instance_name]> -U <username> -P <Password> 

Aby zaimportować dane z tabeli z pliku tekstowego na serwerze docelowym:

bcp <database name>.<schema name>.<table name> IN C:\FILE.TXT -c -t -T -S <server_name[ \instance_name]> -U <username> -P <Password> 
+1

Widziałem to wcześniej, ale ponieważ wyeksportowałem je z serwera produkcyjnego, nie byłem (nadal nie jestem) pewien, czy jest bezpieczny :) – no9

+1

Nie modyfikujesz swojego stolika, więc jest absolutnie bezpieczny, ale pamiętaj, aby poprawnie używać instrukcji IN lub OUT. Aby uzyskać dane z pliku tekstowego do tabeli i wyjścia, aby uzyskać dane z tabeli do pliku tekstowego (lub pliku csv) – praveen

+0

dziękuję za wskazanie tego. +1 – no9

2

Tylko za kopnięcia.

Ponieważ nie było w stanie stworzyć serwer połączony i skoro tylko podłączenie do serwera produkcyjnego nie wystarczyło użyć INSERT INTO Zrobiłem następujące:

  • stworzył kopię zapasową bazy danych serwera produkcja
  • przywrócone bazy danych na mój serwer testowy
  • wykonany wkładkę do sprawozdania

jego backdoor rozwiązanie, ale ponieważ miałem problemy pracował dla mnie .

Po utworzeniu pustych tabel przy użyciu SCRIPT TABLE AS/CREATE w celu przesłania wszystkich kluczy i indeksów nie mogłem użyć SELECT INTO. SELECT INTO działa tylko wtedy, gdy tabele nie istnieją w miejscu docelowym, ale nie kopiuje kluczy i indeksów, więc musisz to zrobić ręcznie. Wadą stosowania instrukcji INSERT INTO jest to, że musisz ręcznie podawać wszystkie nazwy kolumn, a może to powodować problemy, jeśli niektóre ograniczenia klucza obcego zawiodą.

Dziękuję wszystkim ankieterom, że istnieje kilka świetnych rozwiązań, ale zdecydowałem się zaakceptować marc_s anwser.

1

Jest to nieco odchodzenie wokół rozwiązania, ale to działało na mnie Mam nadzieję, że pracuje dla tego problemu dla innych, a także:

można uruchomić kwerendę wybierającą SQL na stole, który chcesz wyeksportować i zapisać wynik jako .xls w tobie.

Teraz utwórz tabelę, do której chcesz dodać dane ze wszystkimi kolumnami i indeksami. Można to łatwo zrobić prawym przyciskiem myszy na rzeczywistej tabeli i wybierając opcję Utwórz do skryptu.

Teraz możesz kliknąć prawym przyciskiem myszy DB, w którym chcesz dodać tabelę i wybrać Zadania> Importuj.

Kreator importu eksportu otwiera się i wybierz następny. Wybierz program Microsoft Excel jako źródło danych, a następnie przeglądaj i wybierz zapisany wcześniej plik .xls.

Teraz wybierz serwer docelowy, a także tabelę docelową, którą utworzyliśmy.

Uwaga: Jeśli istnieje pole oparte na tożsamości, w tabeli docelowej możesz usunąć właściwość tożsamości, ponieważ te dane również zostaną wstawione. Jeśli więc masz tę właściwość tylko jako Tożsamość, wówczas błąd procesu importu.

Teraz kliknij przycisk Dalej i kliknij Zakończ, aby wyświetlić liczbę rekordów importowanych i odnieść sukces, jeśli nie wystąpią żadne błędy.

+0

Najważniejsze dla mnie było to, że mogłem selektywnie wybrać dane do wyeksportowania. –

30

Wystarczy pokazać jeszcze inną opcję (dla SQL Server 2008 i powyżej):

  1. prawym przyciskiem myszy na Bazy Danych -> wybierz „Zadania” -> wybierz
  2. Wybierz konkretne obiekty bazy danych „Generowanie skryptów” chcesz skopiować. Powiedzmy, że jedna lub więcej tabel. Kliknij Dalej
  3. Kliknij Zaawansowane i przewiń do "Typów danych do skryptu" i wybierz "Schemat i dane". Kliknij OK
  4. Wybierz miejsce zapisu wygenerowanego skryptu i przejść klikając Dalej
+2

Ta opcja nie jest dostępna w programie Microsoft SQL Management Studio w wersji 9 (dołączonym do programu SQL Server 2005), do którego najprawdopodobniej odnosi się PO. – Marcel

3

Można to zrobić poprzez „Import/eksport danych ...” w SQL Server Management Studio

0

Jeszcze innym rozwiązaniem, jeśli niech to będzie dostępne: C# .net. W szczególności przestrzeń nazw Microsoft.SqlServer.Management.Smo.

Używam kodu podobnego do następującego w Składniku skryptu jednego z moich pakietów SSIS.

var tableToTransfer = "someTable"; 
var transferringTableSchema = "dbo"; 

var srvSource = new Server("sourceServer"); 
var dbSource = srvSource.Databases["sourceDB"]; 

var srvDestination = new Server("destinationServer"); 
var dbDestination = srvDestination.Databases["destinationDB"]; 

var xfr = 
    new Transfer(dbSource) { 
     DestinationServer = srvDestination.Name, 
     DestinationDatabase = dbDestination.Name, 
     CopyAllObjects = false, 
     DestinationLoginSecure = true, 
     DropDestinationObjectsFirst = true, 
     CopyData = true 
    }; 

xfr.Options.ContinueScriptingOnError = false; 
xfr.Options.WithDependencies = false; 

xfr.ObjectList.Add(dbSource.Tables[tableToTransfer,transferringTableSchema]); 
xfr.TransferData(); 

Myślę, że musiałem jawnie wyszukać i dodać bibliotekę Microsoft.SqlServer.Smo do referencji. Ale poza tym to działa dla mnie.

Aktualizacja: Przestrzeń nazw i biblioteki były bardziej skomplikowane niż pamiętałem.

Dla bibliotek, dodać referencje do:

  • Microsoft.SqlServer.Smo.dll
  • Microsoft.SqlServer.SmoExtended.dll
  • Microsoft.SqlServer.ConnectionInfo.dll
  • Microsoft.SqlServer .Management.Sdk.Sfc.dll

Na przestrzeni nazw, należy dodać:

  • Microsoft.SqlServer.Management.Common
  • Microsoft.SqlServer.Management.Smo