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

325

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

RyanKeeter
источник

Ответы:

208

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

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

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

Эми Б
источник
Вы также должны будете отдельно установить разрешения для таблиц, я полагаю.
Кен Рэй
1
Если вам нужно также выполнить вставку идентификатора, в мастере импорта данных есть опция для этого ^^ - ссылаясь на другой ответ
Кларенс Лиу
13
@TahaRehmanSiddiqui: Потому что это отвечает на вопрос;) Он не спрашивал, как скопировать его между серверами баз данных. Но большинство людей, ищущих этот ответ, заканчивают здесь, потому что Google дает его как первый результат :)
Maarten Kieft
1
@RyanB да, это разрешено.
Эми Б
1
@Tom OP и многие люди, которые приходят на этот вопрос, ищут «оператор SQL», а не инструмент.
Эми Б
535

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

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

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

Дэвид
источник
1
Я не могу найти эту опцию. здесь есть какая-то конкретная версия?
Нервный
35
Вы не можете сказать, что это лучший ответ вообще. Например, для автоматизации нельзя вызывать из скрипта. Кстати, автор специально попросил "..SQL оператор ..". Но, конечно, это отличный ответ, но не лучший;).
гризли
3
Автор попросил переместить "(данные и все)"; поэтому я надеялся, что этот ответ сделал это. Он создает таблицу, но не создает никаких ключей или индексов; так что не так много улучшений по сравнению с ответом на SQL.
unubar
Можно ли указать WHEREусловие с помощью задачи «Импорт данных»? Я не смог найти способ сделать это.
раздавить
1
да, это правильный путь, как упомянуто здесь , но identityи foreign keyссылки удаляются в целевой базе данных, любое решение?
Shaijut
106

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

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

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

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

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

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

leoinfo
источник
Есть ли проблема, если сначала скопировать структуру базовой таблицы (поля и данные), а затем применить скрипт исправления для создания разрешений, индексов, ограничений и расширенных свойств?
leoinfo
4
Это не будет вставлять значения для столбцов идентификаторов в SQL Server 2008. Это разрешено только в том случае, если вы используете список столбцов, а IDENTITY_INSERT включен для целевой таблицы.
Лукас Уилсон-Рихтер
@Lucas - Ты "наполовину" прав :). Однако первый оператор SQL копирует ВСЕ данные, включая значения в столбцах идентификаторов. Как я уже сказал, ограничения не созданы. Но они могут быть легко написаны в исходной БД и применены к целевой БД после перемещения всех данных.
leoinfo
У INSERT INTO...меня вторая версия ( ) работала в Oracle.
vapcguy
Работает ли это, если две базы данных находятся на совершенно разных серверах с разными строками подключения? Если нет, как вы справляетесь с этим?
Александр Райан Баггетт
46

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

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

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

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

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

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

ScottStonehouse
источник
1
Мне нравится этот подход. Выбор * не будет работать, если есть столбец идентификаторов, вам нужно явно перечислить имена столбцов. Вам также нужно будет сделать SET IDENTITY_INSERT TblName ONв этом случае.
JeremyWeir
16

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

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

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

Райана
источник
Смотрите мои комментарии выше:?!? «Как это получить 508/171 голосов и Райана„11 октября '11 в 23:41“Ответ получит только 13 на сегодняшний день Райан является единственным ответ , что ответ это д оп в. Полностью . Потому что ему обрабатывает эти сценарии (которые, между прочим, OP НЕ исключил из своего q.): a) Идентичность ( очень часто), b) Ограничения, c) Триггеры, d) Индексы, e) Разрешения, d) копирование Схемы И Данных ( Подсказка: часть «и все» в операторе «(данные и все)» также подразумевает Схему.) И д) генерирует «оператор SQL», который определил опера, который, даже если он не имел в виду, что это буквально, лучше иметь чем нет.
Том
1
Примечание. Этот ответ полезен только тогда, когда число строк не является «чрезмерным» (т. Е. Таблицы поиска / таблицы небольших транзакций) и не имеет «больших» значений столбцов. Для них я бы использовал ответ Райана, просто чтобы сгенерировать сценарий для создания таблицы (включая атрибуты столбцов и подобъекты), а затем использовать ответ Дэвида Б. «Вставить в выбор». Для отдельных таблиц (вместо A Райана) вы также можете использовать SSMS, Обозреватель объектов, Таблицу щелчка правой кнопкой мыши, Таблицу сценариев как, CREATE To, но сначала необходимо убедиться, что Инструменты, Параметры, Обозреватель объектов SQL Server, Параметры сценариев установить по желанию.
Том
9

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

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>

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

NeverHopeless
источник
1

Если таблица существует и мы хотим скопировать только данные, мы можем попробовать этот запрос.

вставить в Destination_Existing_Tbl выберите col1, col2 FROM Source_Tbl

Mohan
источник
0

Копировать данные

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
Арун Прасад Е.С.
источник