Копирование таблиц из одной базы данных в другую в SQL Server

У меня есть база данных под названием foo и база данных под названием bar. У меня есть таблица в foo под названием tblFoobar, которую я хочу переместить (данные и все) на панель базы данных из базы данных foo. Какая инструкция SQL для этого предназначена?


person RyanKeeter    schedule 09.10.2008    source источник


Ответы (7)


На SQL Server? а на одном сервере базы данных? Используйте трехчастное именование.

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

Это просто перемещает данные. Если вы хотите переместить определение таблицы (и другие атрибуты, такие как разрешения и индексы), вам придется сделать что-то еще.

person Amy B    schedule 09.10.2008
comment
Я полагаю, вам также придется отдельно установить разрешения для таблиц. - person Ken Ray; 09.10.2008
comment
Если вам также нужно вставить идентификационные данные, в мастере импорта данных есть опция для этого ^^ - ссылаясь на другой ответ - person Clarence Liu; 30.08.2013
comment
@TahaRehmanSiddiqui: Потому что он отвечает на вопрос;) Он не спрашивал, как скопировать его между серверами баз данных. Но большинство людей, ищущих этот ответ, попадают сюда, потому что Google дает его как первый результат :) - person Maarten Kieft; 11.04.2014
comment
Можно ли это использовать с оператором WHERE? Например, если бы я хотел вставить только строки, относящиеся к определенному диапазону дат, а не всю таблицу. - person Ryan B; 30.01.2015
comment
@RyanB да, это разрешено. - person Amy B; 31.01.2015
comment
Этот ответ был бы лучше, если бы он показал, как скопировать определение таблицы. - person Ahmed; 25.12.2015
comment
Моя ошибка новичка: при использовании Oracle я получаю ошибку отсутствия правой круглой скобки, если использую круглую скобку вокруг второй группировки полей в этом операторе SELECT. Слово мудрым, не делайте моей ошибки! Оставьте круглые скобки для этой второй группы! :) - person vapcguy; 19.07.2016
comment
Как это получило 171 голосов, а ответ Райана 11 окт. '11 в 23:41 получил только 13 голосов?!? Райан - это единственный ответ, на который ответят операторы q. полностью. Потому что он обрабатывает эти сценарии (которые, кстати, ОП НЕ исключил из своего q.): а) Идентичность (очень часто), б) Ограничения, в) Триггеры , г) индексы, д) разрешения, г) копирование схемы И данных (подсказка: вся часть операции (данные и все) также подразумевает схему.) и е) генерирует оператор SQL, который оператор уточнил, что, даже если он не имел в виду буквально, лучше иметь, чем нет. - person Tom; 15.06.2017
comment
@Tom OP и многие люди, которые задаются этим вопросом, ищут инструкцию SQL, а не инструмент. - person Amy B; 15.06.2017
comment
Примечание: ответ Райана 11 окт. 2011 в 23:41 применим только в том случае, если количество строк не является чрезмерным (например, таблицы поиска / малых транзакций) и нет больших значений столбца. Для них я бы использовал ответ Райана только для создания сценария для создания таблицы (включая атрибуты столбца и суб-объекты), а затем затем использовал команду Дэвида Б. Вставить в выбор ответа. Для одиночных таблиц (вместо Ryan A) вы также можете использовать SSMS, обозреватель объектов, таблицу правой кнопкой мыши, таблицу сценариев как, CREATE To, но вы должны сначала убедиться, что инструменты, параметры, обозреватель объектов SQL Server, параметры сценариев установить по желанию. - person Tom; 16.06.2017
comment
Как это работает, когда две базы данных находятся на разных серверах / требуют разных строк подключения? - person Alexander Ryan Baggett; 25.08.2017
comment
Совет: В SMSS можно перетащить папку столбцов из обозревателя объектов в окно запроса. Это избавляет от необходимости набирать список полей вручную. - person Brian; 10.01.2018

Задача «Импорт данных» в SQL Server Management Studio (щелкните правой кнопкой мыши имя БД, затем задачи) большую часть этого сделает за вас. Запустите его из базы данных, в которую вы хотите скопировать данные.

Если таблицы не существуют, он создаст их для вас, но вам, вероятно, придется воссоздавать какие-либо индексы и тому подобное. Если таблицы действительно существуют, он будет добавлять новые данные по умолчанию, но вы можете настроить это (отредактировать сопоставления), чтобы удалить все существующие данные.

Я использую это все время, и он работает довольно хорошо.

person David    schedule 09.10.2008
comment
я не могу найти эту опцию. здесь есть что-то конкретное для версии? - person Abbas Gadhia; 20.04.2012
comment
В общем, нельзя сказать, что это лучший ответ. Например, автоматизацию нельзя вызывать из сценария. Кстати, автор специально просил об операторе ..SQL ... Но, конечно, это отличный ответ, но не лучший;). - person grizzly; 05.11.2012
comment
Автор попросил переместить (данные и все); поэтому я надеялся, что этот ответ сделал это. Он создает таблицу, но не создает никаких ключей или индексов; так что не так много улучшений по сравнению с ответом SQL. - person unubar; 07.01.2014
comment
Можно ли указать условие WHERE с помощью задачи «Импорт данных»? Я не мог найти способ сделать это. - person crush; 27.01.2014
comment
У меня не было возможности использовать SQL Server Management Studio. Мне пришлось запустить отдельное приложение под названием SQL Server Import / Export Wizard, которое позволило мне создать пакет и определить источник и место назначения. - person Justin Skiles; 09.03.2015
comment
Это очень старый вариант, но в ответ на @grizzly импорт можно сохранить как файл SSIS для повторного использования. Это может помочь людям с рабочими процессами, поддерживающими SSIS. - person GregB; 20.04.2015
comment
да, это правильный способ, как упоминалось тоже здесь, но ссылки identity и foreign key удаляются из целевой базы данных. Какое решение? - person Shaiju T; 16.11.2015
comment
Для меня это лучший ответ, поскольку оператору SQL без нужды не хватило дискового пространства (что должно быть довольно скучной реализацией SQL Server). Это решение использует достаточно места на диске только для создания новой таблицы, не более того. - person karfus; 14.02.2016
comment
Я бы предпочел создать определение таблицы, которое сначала соответствует источнику, потому что в случае автоматического создания таблицы такие вещи, как вычисляемые столбцы, значения по умолчанию, первичный ключ, столбец идентификаторов и т. Д., Не создаются. - person Irawan Soetomo; 09.08.2016
comment
Как это получило 508 голосов, а ответ Райана 11 окт. '11 в 23:41 получил только 13 на сегодняшний день?!? Райан - это единственный ответ, на который ответят операторы q. полностью. Потому что он обрабатывает эти сценарии (которые, кстати, ОП НЕ исключил из своего q.): а) Идентичность (очень часто), б) Ограничения, в) Триггеры , г) индексы, д) разрешения, г) копирование схемы И данных (подсказка: вся часть операции (данные и все) также подразумевает схему.) и е) генерирует оператор SQL, который оператор уточнил, что, даже если он не имел в виду буквально, лучше иметь, чем нет. - person Tom; 15.06.2017
comment
Примечание: ответ Райана 11 окт. 2011 в 23:41 применим только в том случае, если количество строк не является чрезмерным (например, таблицы поиска / малых транзакций) и нет больших значений столбца. Для них я бы использовал ответ Райана только для создания сценария для создания таблицы (включая атрибуты столбца и суб-объекты), а затем затем использовал команду Дэвида Б. Вставить в выбор ответа. Для одиночных таблиц (вместо Ryan A) вы также можете использовать SSMS, обозреватель объектов, таблицу правой кнопкой мыши, таблицу сценариев как, CREATE To, но вы должны сначала убедиться, что инструменты, параметры, обозреватель объектов SQL Server, параметры сценариев установить по желанию. - person Tom; 16.06.2017

Это должно работать:

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

Он не копирует ограничения, значения по умолчанию или индексы. Созданная таблица не будет иметь кластеризованный индекс.

В качестве альтернативы вы можете:

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

Если ваша целевая таблица существует и пуста.

person leoinfo    schedule 09.10.2008
comment
Есть ли проблема, если вы сначала скопируете структуру базовой таблицы (поля и данные), а затем примените сценарий patch для создания разрешений, индексов, ограничений и расширенных свойств? - person leoinfo; 09.10.2008
comment
При этом не будут вставляться значения для столбцов идентификаторов в SQL Server 2008. Это разрешено только при использовании списка столбцов и IDENTITY_INSERT для целевой таблицы. - person Lucas Wilson-Richter; 23.10.2012
comment
@Lucas - Ты наполовину прав :). Однако первый оператор SQL копирует ВСЕ данные, включая значения в столбцах идентификаторов. Как я уже сказал, ограничений не создается. Но они могут быть легко написаны сценарием в исходной БД и применены к целевой БД после перемещения всех данных. - person leoinfo; 23.10.2012
comment
Вторая версия (INSERT INTO...) у меня работала в Oracle. - person vapcguy; 19.07.2016
comment
Работает ли это, если две базы данных находятся на совершенно разных серверах с разными строками подключения? Если нет, то как вы с этим справитесь? - person Alexander Ryan Baggett; 25.08.2017

Если это только одна таблица, все, что вам нужно сделать, это

  • Определение таблицы скриптов
  • Создать новую таблицу в другой базе данных
  • Обновите правила, индексы, разрешения и т. Д.
  • Импортировать данные (несколько вставок в примеры уже показаны выше)

Одна вещь, которую вы должны принять во внимание, - это другие обновления, такие как перенос других объектов в будущем. Обратите внимание, что исходная и конечная таблицы имеют разные имена. Это означает, что вам также придется вносить изменения в зависимые объекты, такие как представления, хранимые процедуры и другие.

К одному или нескольким объектам можно перейти вручную без каких-либо проблем. Однако, когда обновлений больше, чем несколько, сторонние инструменты сравнения очень кстати. Прямо сейчас я использую ApexSQL Diff для миграции схемы, но вы не ошибетесь с другими инструмент там.

person Igor Voplov    schedule 20.03.2013

  1. Напишите сценарий create table в студии управления, запустите этот сценарий в панели, чтобы создать таблицу. (Щелкните правой кнопкой мыши таблицу в проводнике объектов, таблицу сценариев как, создать в ...)

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

person ScottStonehouse    schedule 09.10.2008
comment
Мне нравится такой подход. Выбор * не будет работать, если есть столбец идентификаторов, вам нужно явно указать имена столбцов. В этом случае вам также нужно будет сделать SET IDENTITY_INSERT TblName ON. - person JeremyWeir; 06.06.2012

Вы также можете использовать Мастер создания сценариев SQL Server, который поможет создать сценарии SQL, которые могут выполнять следующие действия:

  • скопировать схему таблицы
  • любые ограничения (идентичность, значения по умолчанию и т. д.)
  • данные в таблице
  • и многие другие варианты при необходимости

Хороший пример рабочего процесса для SQL Server 2008 со снимками экрана, показанными здесь.

person ryan    schedule 11.10.2011
comment
См. Мои комментарии выше: Как это получило 508/171 голосов и ответ Райана 11 окт. '11 в 23:41 на сегодняшний день только 13?!? Райан - это единственный ответ, на который ответят операторы q. полностью. Потому что он обрабатывает эти сценарии (которые, кстати, ОП НЕ исключил из своего q.): а) Идентичность (очень часто), б) Ограничения, в) Триггеры , d) индексы, e) разрешения, d) копирование схемы и данных (подсказка: вся часть операции (данные и все) также подразумевает схему.) и e) генерирует оператор SQL, который оператор уточнил, что, даже если он не имел в виду буквально, лучше иметь, чем нет .. - person Tom; 15.06.2017
comment
Примечание. Этот ответ применим только в том случае, если количество строк не является чрезмерным (например, таблицы поиска / малых транзакций) и нет больших значений столбца. Для них я бы использовал ответ Райана только для создания сценария для создания таблицы (включая атрибуты столбца и суб-объекты), а затем использовал бы вставку Дэвида Б. в ответ для выбора. Для одиночных таблиц (вместо Ryan A) вы также можете использовать SSMS, обозреватель объектов, таблицу правой кнопкой мыши, таблицу сценариев как, CREATE To, но вы должны сначала убедиться, что инструменты, параметры, обозреватель объектов SQL Server, параметры сценариев установить по желанию. - person Tom; 16.06.2017

Вы можете пойти по этому пути: (общий пример)

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

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

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

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

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

Помните, что сценарий копирования строк будет работать, если базы данных находятся в одном месте.


Вы можете попробовать это.

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

Имя сервера указывать необязательно, если обе БД находятся на одном сервере.

person NeverHopeless    schedule 06.05.2012