Skopiuj tabele z jednej bazy danych do drugiej w SQL Server

324

Mam bazę danych o nazwie foo i bazę danych o nazwie bar. Mam tabelę w foo o nazwie tblFoobar, którą chcę przenieść (dane i wszystkie) do paska bazy danych z bazy danych foo. Jaka jest do tego instrukcja SQL?

RyanKeeter
źródło

Odpowiedzi:

208

Na SQL Server? i na tym samym serwerze bazy danych? Użyj trzech części nazewnictwa.

INSERT INTO bar..tblFoobar( *fieldlist* )
SELECT *fieldlist* FROM foo..tblFoobar

To po prostu przenosi dane. Jeśli chcesz przenieść definicję tabeli (i inne atrybuty, takie jak uprawnienia i indeksy), musisz zrobić coś innego.

Amy B.
źródło
Wierzę, że będziesz musiał osobno ustawić uprawnienia do tabeli.
Ken Ray
1
Jeśli musisz także wstawiać identyfikatory, Kreator importu danych ma taką opcję ^^ - odnosząc się do innej odpowiedzi
Clarence Liu
13
@TahaRehmanSiddiqui: Ponieważ odpowiada na pytanie;) Nie pytał, jak skopiować go między serwerami baz danych. Ale większość osób szukających tej odpowiedzi kończy się tutaj, ponieważ Google daje ją jako pierwszy wynik :)
Maarten Kieft
1
@RyanB tak, to jest dozwolone.
Amy B
1
@Tom OP i wiele osób, które zadają to pytanie, szukają „instrukcji SQL”, a nie narzędzia.
Amy B
535

Zadanie „Import danych” programu SQL Server Management Studio (kliknij prawym przyciskiem myszy nazwę DB, a następnie zadania) wykona większość z Ciebie. Uruchom go z bazy danych, do której chcesz skopiować dane.

Jeśli tabele nie istnieją, utworzy je dla Ciebie, ale prawdopodobnie będziesz musiał odtworzyć wszelkie indeksy i tym podobne. Jeśli tabele istnieją, domyślnie dołączą nowe dane, ale można je dostosować (edytować odwzorowania), aby usunąć wszystkie istniejące dane.

Używam tego cały czas i działa całkiem dobrze.

David
źródło
1
nie mogę znaleźć tej opcji. czy jest tu coś specyficznego dla wersji?
Nerrve,
35
Naprawdę nie można powiedzieć, że ogólnie jest to lepsza odpowiedź. Na przykład automatyzacja nie może być wywoływana z poziomu skryptu. BTW autor poprosił specjalnie o „..SQL instrukcja ..”. Ale oczywiście to świetna odpowiedź, ale nie lepsza;).
grizzly,
3
Autor poprosił o przeniesienie „(dane i wszystkie)”; więc miałem nadzieję, że ta odpowiedź tak zrobiła. Tworzy tabelę, ale nie tworzy żadnych kluczy ani indeksów; więc niewiele poprawa w stosunku do odpowiedzi SQL.
unubar
Czy można określić WHEREwarunek za pomocą zadania Importuj dane? Nie mogłem znaleźć sposobu, aby to zrobić.
zmiażdżyć
1
Tak to jest poprawny sposób jak wspomniano tutaj też, ale identityi foreign keyodniesienia są usuwane w docelowej bazie danych, każde rozwiązanie?
shaijut
106

To powinno działać:

SELECT * 
INTO DestinationDB..MyDestinationTable 
FROM SourceDB..MySourceTable 

To będzie nie skopiować constaints, domyślnie lub indeksów. Utworzona tabela nie będzie miała indeksu klastrowego.

Alternatywnie możesz:

INSERT INTO DestinationDB..MyDestinationTable 
SELECT * FROM SourceDB..MySourceTable

Jeśli tabela docelowa istnieje i jest pusta.

leoinfo
źródło
Czy istnieje problem, jeśli najpierw skopiujesz strukturę tabeli podstawowej (pola i dane), a następnie zastosujesz skrypt łatki, aby utworzyć uprawnienia, indeksy, ograniczenia i rozszerzone właściwości?
leoinfo
4
Nie spowoduje to wstawienia wartości dla kolumn tożsamości w SQL Server 2008. Jest to dozwolone tylko wtedy, gdy używasz listy kolumn i IDENTITY_INSERT jest włączony dla tabeli docelowej.
Lucas Wilson-Richter
@Lucas - Masz „połowę” racji :). Jednak pierwsza instrukcja SQL kopiuje WSZYSTKIE dane, w tym wartości w kolumnach tożsamości. Jak powiedziałem, ograniczenia nie są tworzone. Można je jednak łatwo skryptować na źródłowej bazie danych i stosować do docelowej bazy danych po przeniesieniu wszystkich danych.
leoinfo
Druga wersja ( INSERT INTO...) działała dla mnie w Oracle.
vapcguy
Czy to działa, jeśli 2 bazy danych znajdują się na zupełnie różnych serwerach z różnymi ciągami połączeń? Jeśli nie, jak sobie z tym poradzisz?
Alexander Ryan Baggett,
46

Jeśli jest tylko jeden stół, wszystko, co musisz zrobić, to

  • Definicja tabeli skryptów
  • Utwórz nową tabelę w innej bazie danych
  • Zaktualizuj reguły, indeksy, uprawnienia i tym podobne
  • Importuj dane (kilka wstawek do przykładów pokazano już powyżej)

Jedną rzeczą, którą musisz wziąć pod uwagę, są inne aktualizacje, takie jak migracja innych obiektów w przyszłości. Pamiętaj, że tabele źródłowa i docelowa nie mają tej samej nazwy. Oznacza to, że będziesz musiał również wprowadzić zmiany, jeśli zależne obiekty, takie jak widoki, procedury składowane i inne.

Z jednym lub kilkoma obiektami możesz przejść ręcznie bez żadnych problemów. Jednak gdy jest więcej niż kilka aktualizacji, narzędzia do porównywania innych firm są bardzo przydatne. Obecnie używam ApexSQL Diff do migracji schematów, ale nie można pomylić się z żadnym innym narzędziem.

Igor Wopłow
źródło
23
  1. Skrypt create tablew studio zarządzania, uruchom ten skrypt na pasku, aby utworzyć tabelę. (Tabela prawym przyciskiem myszy w eksploratorze obiektów, tabela skryptów jako, utwórz do ...)

  2. INSERT bar.[schema].table SELECT * FROM foo.[schema].table

ScottStonehouse
źródło
1
Lubię to podejście. Wybierz * nie będzie działać, jeśli istnieje kolumna tożsamości, musisz jawnie wymienić nazwy kolumn. W SET IDENTITY_INSERT TblName ONtakim przypadku musisz także zrobić .
JeremyWeir
16

Możesz także użyć Kreatora generowania skryptów SQL Server, aby pomóc w tworzeniu skryptów SQL, które mogą wykonywać następujące czynności:

  • skopiuj schemat tabeli
  • wszelkie ograniczenia (tożsamość, wartości domyślne itp.)
  • dane w tabeli
  • i wiele innych opcji w razie potrzeby

Dobrym przykładem Workflow dla SQL Server 2008 ze zrzutami ekranowymi pokazanych tutaj .

Ryan
źródło
Zobacz moje komentarze powyżej: „Jak to się uzyskało 508/171 głosów i Ryana” 11 października o 23:41 „Odpowiedź otrzymała tylko 13 do tej pory?!? Ryan jest jedyną odpowiedzią, w której odpowiedź jest q. Całkowicie . Ponieważ to obsługuje te scenariusze (które, przy okazji, PO NIE wykluczyły z jego q.): a) Tożsamość ( bardzo często), b) Ograniczenia, c) Wyzwalacze, d) Indeksy, e) Uprawnienia, d) kopiowanie schematu ORAZ ( Podpowiedź: „i wszystko” część operacji „(dane i wszystko)” implikuje również Schemat.) E) generuje „instrukcję SQL” określoną przez operację, która nawet jeśli nie miał na myśli tego dosłownie, lepiej mieć niż nie. ”.
Tom
1
Uwaga: Ta odpowiedź jest praktyczna tylko wtedy, gdy liczba wierszy nie jest „nadmierna” (tj. Tabele wyszukiwania / małe transakcje) i nie ma „dużych” wartości kolumny. W tym przypadku użyłbym odpowiedzi Ryana tylko do wygenerowania skryptu do tworzenia tabeli (w tym atrybutów kolumny i podobiektów), a następnie użyłem odpowiedzi „Wstaw do zaznaczenia” Davida B. W przypadku pojedynczych tabel (zamiast Ryana A) możesz także użyć SSMS, Eksploratora obiektów, Tabeli prawym przyciskiem myszy, Tabeli skryptów jako, UTWÓRZ Do, ale musisz najpierw upewnić się, że Narzędzia, Opcje, Eksplorator obiektów SQL Server, Opcje skryptów są ustaw zgodnie z życzeniem.
Tom
9

Możesz przejść w ten sposób: (ogólny przykład)

insert into QualityAssuranceDB.dbo.Customers (columnA, ColumnB)
Select columnA, columnB from DeveloperDB.dbo.Customers

Również jeśli chcesz wygenerować nazwy kolumn, aby wstawić klauzulę wstawiania, użyj:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName')

Skopiuj wynik i wklej do okna zapytania, aby przedstawić nazwy kolumn tabeli, a nawet to wykluczy również kolumnę tożsamości:

    select (name + ',') as TableColumns from sys.columns 
where object_id = object_id('YourTableName') and is_identity = 0

Pamiętaj, że skrypt do kopiowania wierszy będzie działał, jeśli bazy danych należą do tej samej lokalizacji.


Możesz tego spróbować.

select * into <Destination_table> from <Servername>.<DatabaseName>.dbo.<sourceTable>

Nazwa serwera jest opcjonalna, jeśli obie bazy danych znajdują się na tym samym serwerze.

NeverHopeless
źródło
1

Jeśli istnieje tabela i chcemy skopiować tylko dane, możemy wypróbować to zapytanie.

wstaw do Destination_Existing_Tbl wybierz col1, col2 FROM Source_Tbl

Mohan
źródło
0

Kopiuj dane

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
Arun Prasad ES
źródło