SQL Server - utworzyć kopię tabeli bazy danych i umieścić ją w tej samej bazie danych?

108

Mam tabelę ABC w bazie danych. Chcę utworzyć kopie ABC o nazwach ABC_1, ABC_2, ABC_3 w tej samej bazie danych. Jak mogę to zrobić za pomocą Management Studio (najlepiej) lub zapytań SQL?

Dotyczy to programu SQL Server 2008 R2.

sequel.learner
źródło
1
inny post, który nie jest bezpośrednio powiązany, ale może być powiązany z powyższym przypadkiem użycia - stackoverflow.com/questions/6810425/ ... może to być przydatne, gdy chcesz edytować kopie tabeli (np. zezwalaj na wartości null, zmień typ danych itp. .) bez konieczności ponownego tworzenia kopii.
sequel.learner

Odpowiedzi:

212

Zastosowanie SELECT ... INTO:

SELECT *
INTO ABC_1
FROM ABC;

Spowoduje to utworzenie nowej tabeli, ABC_1która ma taką samą strukturę kolumn jak ABCi zawiera te same dane. Jednak ograniczenia (np. Klucze, wartości domyślne) nie są kopiowane.

Możesz uruchomić to zapytanie wiele razy z inną nazwą tabeli za każdym razem.


Jeśli nie potrzebujesz kopiować danych, a jedynie w celu utworzenia nowej, pustej tabeli o takiej samej strukturze kolumn, dodaj WHEREklauzulę z fałszywym wyrażeniem:

SELECT *
INTO ABC_1
FROM ABC
WHERE 1 <> 1;
Mahmoud Gamal
źródło
3
Doskonała odpowiedź na mój problem.
sequel.learner
8
Nie działa całkowicie ... kolumny obliczeniowe w oryginale nie są kopiowane jako takie same w miejscu docelowym. Ponadto ograniczenia PK i Default również nie są kopiowane
Simon Green
@SimonGreen - Możesz zadać nowe pytanie dotyczące tego problemu ze swoim kodem.
Mahmoud Gamal
3
Oczywiście to nie działa całkowicie. Ostrzegł, że ograniczenia nie są kopiowane, ani klucze podstawowe ani wartości domyślne. Polecenie, które oferuje, tworzy nową tabelę o tej samej strukturze kolumn (tak jak powiedział) i wstawia wszystkie dane do nowej tabeli za Ciebie.
user5855178
1
Uważam, że używam SELECT TOP(0) *czystszej niż WHEREmetoda zawsze fałszywych stwierdzeń
Thymine
21

Skopiuj schemat (wygeneruj DDL) za pośrednictwem interfejsu użytkownika SSMS

W SSMS rozwiń bazę danych w Object Explorer , przejdź do Tables , kliknij prawym przyciskiem myszy interesującą Cię tabelę i wybierz Script Table As , Create To , New Query Editor Window . Czy się znaleźć i zastąpić ( CTRL + H ), aby zmienić nazwę tabeli (czyli umieścić ABCw Znajdowanie co pola i ABC_1w Zamień następnie kliknij przycisk OK ).

Skopiuj schemat za pomocą T-SQL

Inne odpowiedzi pokazujące, jak to zrobić za pomocą SQL, również działają dobrze, ale różnica w tej metodzie polega na tym, że otrzymasz także wszelkie indeksy, ograniczenia i wyzwalacze.

Kopiuj dane

Jeśli chcesz dołączyć dane, po utworzeniu tej tabeli uruchom poniższy skrypt, aby skopiować wszystkie dane z ABC (zachowując te same wartości ID, jeśli masz pole tożsamości):

set identity_insert ABC_1 on
insert into ABC_1 (column1, column2) select column1, column2 from ABC
set identity_insert ABC_1 off
JohnLBevan
źródło
1
Czy na pewno ta metoda również kopiuje indeksy? Spróbowałem i nie udało się.
BornToCode
3
Musisz ustawić IDENTITY_INSERTna ON, aby zezwolić na ustawienie kolumny tożsamości „ręcznie”, w przykładzie została zmieszana kolejność. Musisz także WYJAŚNIĆ listę swoich kolumn
jean
2
Dzięki @jean; dobrze zauważony po 6 latach niezauważony! Naprawiony.
JohnLBevan
To prawie rozwiązało problem. Ostatnia sztuczka polega na tym, że możesz przeciągnąć folder „Kolumny” z drzewa w SSMS do edytora, aby uzyskać listę kolumn. Mam kolumnę z datownikiem w każdej tabeli, więc musiałem pobrać listę kolumn, a następnie usunąć znacznik czasu.
Wade Hatler
10

Jeśli chcesz zduplikować tabelę ze wszystkimi jej ograniczeniami i kluczami, wykonaj poniższe czynności:

  1. Otwórz bazę danych w SQL Management Studio.
  2. Kliknij prawym przyciskiem myszy tabelę, którą chcesz powielić.
  3. Wybierz opcję Tabela skryptów jako -> Utwórz w -> Nowe okno edytora zapytań. Spowoduje to wygenerowanie skryptu do ponownego utworzenia tabeli w nowym oknie zapytania.
  4. Zmień nazwę tabeli oraz względne klucze i ograniczenia w skrypcie.
  5. Wykonaj skrypt.

Następnie, aby skopiować dane, uruchom poniższy skrypt:

SET IDENTITY_INSERT DuplicateTable ON

INSERT Into DuplicateTable ([Column1], [Column2], [Column3], [Column4],... ) 
SELECT [Column1], [Column2], [Column3], [Column4],... FROM MainTable

SET IDENTITY_INSERT DuplicateTable OFF
Rousonur Jaman
źródło
4

1 opcja

select *
  into ABC_1
  from ABC;

Druga opcja: użyj SSIS, czyli kliknij prawym przyciskiem myszy bazę danych w eksploratorze obiektów> wszystkie zadania> eksportuj dane

  • źródło i cel: twoja baza danych
  • tabela źródłowa: ABC
  • tabela docelowa: ABC_1 (tabela zostanie utworzona)
Claude
źródło
2

To kolejna opcja:

select top 0 * into <new_table> from <original_table>
Keni
źródło
2
To żądanie kopiuje tabelę bez danych. Użytkownik w ogóle poprosił o skopiowanie tabel.
Alekzander
1

użyj sql server manegement studio lub netcat i łatwiej będzie manipulować sql

gasroot
źródło
1

Aby skopiować tabelę i jej dane, ograniczenia i wyzwalacze, musisz napisać SSIS. W naszej organizacji mamy oprogramowanie Kal Admin firmy kalrom Systems, które ma darmową wersję do pobrania (myślę, że funkcja kopiowania tabel jest opcjonalna)

Chris D.
źródło