SQL Server - создать копию таблицы базы данных и поместить ее в ту же базу данных?


108

У меня есть таблица ABC в базе данных DB. Я хочу создать копии ABC с именами ABC_1, ABC_2, ABC_3 в той же БД. Как я могу это сделать, используя Management Studio (желательно) или SQL-запросы?

Это для SQL Server 2008 R2.


1
другой пост, не связанный напрямую, но может быть связан с приведенным выше вариантом использования - stackoverflow.com/questions/6810425/… это может быть полезно, когда вы хотите отредактировать копии таблицы (например, разрешить нули, изменить тип данных и т. д. .) без необходимости воссоздавать копии.
sequel.learner

Ответы:


212

Использование SELECT ... INTO:

SELECT *
INTO ABC_1
FROM ABC;

Это создаст новую таблицу ABC_1с той же структурой столбцов, что ABCи те же данные, и с такими же данными. Однако ограничения (например, ключи, значения по умолчанию) не копируются.

Вы можете запускать этот запрос несколько раз с другим именем таблицы каждый раз.


Если вам не нужно копировать данные, только чтобы создать новую пустую таблицу с той же структурой столбцов, добавьте WHEREпредложение с ложным выражением:

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

3
Прекрасный ответ на мою проблему.
sequel.learner

8
Не работает полностью .... вычисляемые столбцы в оригинале не копируются так же, как в целевом. Кроме того, ограничения PK и Default также не копируются
Саймон Грин

@SimonGreen - вы можете задать новый вопрос об этой проблеме с помощью вашего кода.
Махмуд Гамаль

3
Конечно, полностью не работает. Он предупредил, что ограничения не копируются, как и первичные ключи или значения по умолчанию. Предлагаемая им команда создает новую таблицу с той же структурой столбцов (как он и сказал) и вставляет все данные в новую таблицу за вас.
user5855178 05

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

21

Скопируйте схему (сгенерируйте DDL) через пользовательский интерфейс SSMS

В SSMS разверните базу данных в обозревателе объектов , перейдите в « Таблицы» , щелкните правой кнопкой мыши интересующую вас таблицу и выберите « Сценарий таблицы как» , « Создать в» , « Новое окно редактора запросов» . Выполните поиск и замену ( CTRL + H ), чтобы изменить имя таблицы (т.е. введите ABCв поле « Найти» и ABC_1в поле « Заменить на», затем нажмите « ОК» ).

Скопировать схему через 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значение ON, чтобы разрешить установку столбца идентификаторов «вручную», вы смешали порядок в своем примере. Кроме того , вы должны поименный список ваших колонок
жан

2
Спасибо, @jean; хорошо заметен через 6 лет незамеченным! Исправлена.
JohnLBevan

Для меня это почти решило проблему. Последний трюк - вы можете перетащить папку «Столбцы» в дереве SSMS в редактор, чтобы получить список столбцов. У меня есть столбец с меткой времени в каждой таблице, поэтому мне пришлось получить список столбцов, а затем удалить метку времени.
Уэйд Хатлер,

10

Если вы хотите продублировать таблицу со всеми ее ограничениями и ключами, выполните следующие действия:

  1. Откройте базу данных в SQL Management Studio.
  2. Щелкните правой кнопкой мыши таблицу, которую вы хотите продублировать.
  3. Выберите Script Table as -> Create to -> New Query Editor Window. Это сгенерирует сценарий для воссоздания таблицы в новом окне запроса.
  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;

2-й вариант: используйте SSIS, то есть щелкните правой кнопкой мыши базу данных в проводнике объектов> все задачи> экспортировать данные

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

2

Это еще один вариант:

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

2
Этот запрос копирует таблицу без данных. Пользователь попросил вообще скопировать таблицы.
Alekzander


1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.