SQL Server - Створіть копію таблиці бази даних та розмістіть її в одній базі даних?


108

У мене є таблиця ABC в БД бази даних. Я хочу створити копії ABC з іменами ABC_1, ABC_2, ABC_3 в одній БД. Як я можу це зробити, використовуючи Management Studio (бажано) або SQL запити?

Це для SQL Server 2008 R2.


1
інша публікація, не пов’язана безпосередньо, але може бути пов’язана з вищезгаданим випадком використання - stackoverflow.com/questions/6810425/…, це може бути корисно, коли ви бажаєте редагувати копії таблиці (наприклад, дозволити нулі, змінити тип даних тощо) .) без необхідності відтворювати копії.
продължение.learner

Відповіді:


212

Використання SELECT ... INTO:

SELECT *
INTO ABC_1
FROM ABC;

Це створить нову таблицю, ABC_1яка має таку ж структуру стовпців, що ABCі ті самі дані. Однак обмеження (наприклад, клавіші, значення за замовчуванням) не копіюються.

Ви можете запустити цей запит кілька разів з різною назвою таблиці кожен раз.


Якщо вам не потрібно копіювати дані, потрібно лише створити нову порожню таблицю з тією ж структурою стовпців, додати WHEREпункт із фальшивим виразом:

SELECT *
INTO ABC_1
FROM ABC
WHERE 1 <> 1;

3
Ідеальна відповідь на мою проблему.
продължение.learner

8
Не працює повністю .... обчислені стовпці в оригіналі не копіюються як однакові в ціль. Також обмеження ПК та замовчування також не копіюються
Саймон Грін

@SimonGreen - Ви можете задати нове запитання щодо цієї проблеми зі своїм кодом.
Махмуд Гамаль

3
Звичайно, це не працює повністю. Він попередив, що обмеження не копіюються, не виконуються первинні ключі або значення за замовчуванням. Команда, яку він пропонує, створює нову таблицю з тією ж структурою стовпців (так само, як він сказав) і вставляє всі дані в нову для вас таблицю.
користувач5855178

1
Я вважаю, що використовую SELECT TOP(0) *більш чистий WHEREметод, ніж завжди хибний твердження
Thymine

21

Копіювати схему (Створити DDL) через інтерфейс SSMS

У SSMS розгорніть свою базу даних в Провіднику об’єктів , перейдіть до Таблиць , клацніть правою кнопкою миші на потрібній вам таблиці та виберіть Скриптова таблиця як , Створити , Вікно редактора нових запитів . Знайдіть і замініть ( CTRL + H ), щоб змінити назву таблиці (тобто поставте ABCв полі Find What і ABC_1в пункті Replace With і натисніть кнопку OK ).

Скопіюйте схему через T-SQL

Інші відповіді, що показують, як це зробити за допомогою SQL, також працюють добре, але різниця у цьому методі полягає в тому, що ви також отримаєте будь-які індекси, обмеження та тригери.

Скопіюйте дані

Якщо ви хочете включити дані, після створення цієї таблиці запустіть сценарій нижче, щоб скопіювати всі дані з ABC (зберігаючи однакові значення ідентифікаторів, якщо у вас є поле ідентифікації):

set identity_insert ABC_1 on
insert into ABC_1 (column1, column2) select column1, column2 from ABC
set identity_insert ABC_1 off

1
Ви впевнені, що цей метод також копіює індекси? Я спробував це, і не вдалося.
BornToCode

3
Ви повинні встановити IDENTITY_INSERTзначення УВІМКНЕНО, щоб дозволити встановити стовпець посвідчення "вручну", ви змішали порядок у своєму прикладі. Крім того , ви повинні поіменний список ваших колонок
жан

2
Спасибі @jean; добре помічений через 6 років непомітно! Виправлено.
JohnLBevan

Це майже вирішило проблему для мене. Останній трюк полягає в тому, що ви можете перетягнути папку "Стовпці" з дерева в SSMS в редактор, щоб отримати список стовпців. Я маю стовпчик часових позначок на кожній таблиці, тому мені довелося отримати список стовпців, а потім видалити часову позначку.
Вейд Хатлер

10

Якщо ви хочете дублювати таблицю з усіма її обмеженнями та ключами, виконайте наступні дії:

  1. Відкрийте базу даних в SQL Management Studio.
  2. Клацніть правою кнопкою миші на таблиці, яку потрібно дублювати.
  3. Виберіть Таблицю сценаріїв як -> Створити до -> Вікно редактора нових запитів. Це створить сценарій для відтворення таблиці в новому вікні запитів.
  4. Змініть ім'я таблиці та відносні ключі та обмеження в сценарії.
  5. Виконати сценарій.

Потім для копіювання даних запустіть цей сценарій нижче:

SET IDENTITY_INSERT DuplicateTable ON

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

SET IDENTITY_INSERT DuplicateTable OFF

4

1-й варіант

select *
  into ABC_1
  from ABC;

Другий варіант: використовуйте SSIS, тобто клацніть правою кнопкою миші на базі даних в Explorer Explorer> всі завдання> експорт даних

  • джерело та ціль: ваша БД
  • вихідна таблиця: ABC
  • цільова таблиця: ABC_1 (таблиця буде створена)

2

Це ще один варіант:

select top 0 * into <new_table> from <original_table>

2
Цей запит копіює таблицю без даних. Користувача просять взагалі копіювати таблиці.
Алекзандр

1

використовуйте студію манекеру сервера sql або netcat, і це буде простіше маніпулювати sql


1

Вам потрібно написати SSIS, щоб скопіювати таблицю та її дані, обмеження та тригери. У нашій організації є програмне забезпечення під назвою Kal Admin від Kalrom Systems, яке має безкоштовну версію для завантаження (я думаю, що функція таблиць копіювання необов’язкова)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.