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


На SQL Server? а на одном сервере базы данных? Используйте трехчастное именование.
INSERT INTO bar..tblFoobar( *fieldlist* )
SELECT *fieldlist* FROM foo..tblFoobar
Это просто перемещает данные. Если вы хотите переместить определение таблицы (и другие атрибуты, такие как разрешения и индексы), вам придется сделать что-то еще.
Если вам также нужно выполнить вставку идентификаторов, в мастере импорта данных есть опция для этого ^^ - ссылаясь на другой ответ
@TahaRehmanSiddiqui: Потому что он отвечает на вопрос;) Он не спрашивал, как скопировать его между серверами баз данных. Но большинство людей, ищущих этот ответ, попадают сюда, потому что Google дает его как первый результат :)
Можно ли это использовать с оператором WHERE? Например, если бы я хотел вставить только строки, относящиеся к определенному диапазону дат, а не всю таблицу.
@RyanB да, это разрешено.
Этот ответ был бы лучше, если бы он показал, как скопировать определение таблицы.
Моя ошибка новичка: при использовании Oracle я получаю ошибку «отсутствует правая круглая скобка», если я использую круглые скобки вокруг второй группировки полей в этом операторе SELECT. Слово мудрым, не делайте моей ошибки! Оставьте круглые скобки для этой второй группы! :)
Как это набрало 171 голосов, а ответ Райана «11 окт. 2011 в 23:41» получил только 13 голосов?!? Ryan - это только ответ, который отвечает на вопрос o.p. полностью. Потому что он обрабатывает эти сценарии (которые, кстати, OP НЕ исключил из своего q.): A) Идентичность (общий очень), b) Ограничения, c) Триггеры, d) Индексы, e) Разрешения, d) копирование схемы И Данные (Подсказка: часть «и все» в операторе «(данные и все)» также подразумевает схему.) И е) генерирует «оператор SQL», который оператор уточнил, что, даже если он не имел в виду буквально, лучше иметь, чем нет.
@Tom OP и многие люди, которые задаются этим вопросом, ищут «оператор SQL», а не инструмент.
Примечание. Ответ Райана «11 октября 2011 г., 23:41» применим только в том случае, если количество строк не является «чрезмерным» (например, таблицы поиска / малых транзакций) и нет «больших» значений столбца. Для них я бы использовал ответ Райана только для создания сценария для создания таблицы (включая атрибуты столбца и суб-объекты), а потом использовал бы ответ Дэвида Б. «Вставить в выбор». Для отдельных таблиц (вместо Ryan A) вы также можете использовать SSMS, обозреватель объектов, таблицу правой кнопкой мыши, таблицу сценариев как, CREATE To, но вы должны сначала убедиться, что инструменты, параметры, обозреватель объектов SQL Server, параметры сценариев установить по желанию.
Как это работает, когда две базы данных находятся на разных серверах / требуют разных строк подключения?
Совет: В SMSS можно перетащить столбцы «Папка» из обозревателя объектов в окно запроса. Это избавляет от необходимости набирать список полей вручную.
Это должно работать:
SELECT *
INTO DestinationDB..MyDestinationTable
FROM SourceDB..MySourceTable
нет скопирует ограничения, значения по умолчанию или индексы. Созданная таблица будет иметь кластерный индекс нет.
В качестве альтернативы вы можете:
INSERT INTO DestinationDB..MyDestinationTable
SELECT * FROM SourceDB..MySourceTable
Если ваша целевая таблица существует и пуста.
Есть ли проблема, если вы сначала скопируете структуру базовой таблицы (поля и данные), а затем примените сценарий пластырь для создания разрешений, индексов, ограничений и расширенных свойств?
При этом не будут вставляться значения для столбцов идентификаторов в SQL Server 2008. Это разрешено только при использовании списка столбцов и IDENTITY_INSERT для целевой таблицы.
@Lucas - Вы "наполовину" правы :). Однако первый оператор SQL копирует ВСЕ данные, включая значения в столбцах идентификаторов. Как я уже сказал, ограничений не создается. Но они могут быть легко написаны сценарием в исходной БД и применены к целевой БД после перемещения всех данных.
Вторая версия (INSERT INTO...) у меня работала в Oracle.
Работает ли это, если две базы данных находятся на совершенно разных серверах с разными строками подключения? Если нет, то как вы с этим справитесь?
Напишите сценарий create table в студии управления, запустите этот сценарий в панели, чтобы создать таблицу. (Щелкните правой кнопкой мыши таблицу в проводнике объектов, таблицу сценариев как, создать в ...)
INSERT bar.[schema].table SELECT * FROM foo.[schema].table
Мне нравится такой подход. Выбор * не будет работать, если есть столбец идентификаторов, вам нужно явно указать имена столбцов. В этом случае вам также понадобится SET IDENTITY_INSERT TblName ON.
Задача «Импорт данных» в SQL Server Management Studio (щелкните правой кнопкой мыши имя БД, затем задачи) большую часть этого сделает за вас. Запустите его из базы данных, в которую вы хотите скопировать данные.
Если таблицы не существуют, он создаст их для вас, но вам, вероятно, придется воссоздать какие-либо индексы и тому подобное. Если таблицы действительно существуют, он будет добавлять новые данные по умолчанию, но вы можете настроить это (отредактировать сопоставления), чтобы удалить все существующие данные.
Я использую это все время, и он работает довольно хорошо.
я не могу найти эту опцию. здесь есть что-то конкретное для версии?
В общем, нельзя сказать, что это лучший ответ. Например, невозможно вызвать автоматизацию из сценария. Кстати, автор специально просил "..SQL statement ..". Но, конечно, отличный ответ, но не лучший;).
Автор попросил переместить «(данные и все)»; поэтому я надеялся, что этот ответ сделал это. Он создает таблицу, но не создает никаких ключей или индексов; так что не так много улучшений по сравнению с ответом SQL.
Можно ли указать условие WHERE с помощью задачи «Импорт данных»? Я не мог найти способ сделать это.
У меня не было возможности использовать SQL Server Management Studio. Мне пришлось запустить отдельное приложение под названием «Мастер импорта / экспорта SQL Server», которое позволило мне создать пакет и определить источник и место назначения.
Это очень старый вариант, но в ответ на @grizzly импорт можно сохранить как файл SSIS для повторного использования. Это может помочь людям с рабочими процессами, поддерживающими SSIS.
да, это правильный способ, как уже упоминалось, здесь тоже, но ссылки identity и foreign key удаляются в целевой базе данных, какое-либо решение?
Для меня это лучший ответ, поскольку оператору SQL без нужды не хватило дискового пространства (что должно быть довольно скучной реализацией SQL Server). Это решение использует достаточно места на диске только для создания новой таблицы, не более того.
Я бы предпочел сначала создать определение таблицы, которое соответствует источнику, потому что в случае автоматического создания таблицы такие вещи, как вычисляемые столбцы, значения по умолчанию, первичный ключ, столбец идентификаторов и т. д., Не создаются.
Как это получило 508 голосов, а ответ Райана «11 окт. 2011 в 23:41» получил только 13 голосов?!? Ryan - это только ответ, который отвечает на вопрос o.p. полностью. Потому что он обрабатывает эти сценарии (которые, кстати, OP НЕ исключил из своего q.): A) Идентичность (общий очень), b) Ограничения, c) Триггеры, d) Индексы, e) Разрешения, d) копирование схемы И Данные (Подсказка: часть «и все» в операторе «(данные и все)» также подразумевает схему.) И е) генерирует «оператор SQL», который оператор уточнил, что, даже если он не имел в виду буквально, лучше иметь, чем нет.
Примечание. Ответ Райана «11 октября 2011 г., 23:41» применим только в том случае, если количество строк не является «чрезмерным» (например, таблицы поиска / малых транзакций) и нет «больших» значений столбца. Для них я бы использовал ответ Райана только для создания сценария для создания таблицы (включая атрибуты столбца и суб-объекты), а потом использовал бы ответ Дэвида Б. «Вставить в выбор». Для отдельных таблиц (вместо Ryan A) вы также можете использовать SSMS, обозреватель объектов, таблицу правой кнопкой мыши, таблицу сценариев как, CREATE To, но вы должны сначала убедиться, что инструменты, параметры, обозреватель объектов SQL Server, параметры сценариев установить по желанию.
Вы также можете использовать Мастер создания сценариев SQL Server, чтобы помочь создать сценарий SQL, который может выполнять следующие действия:
Хороший пример рабочего процесса для SQL Server 2008 с показанными снимками экрана здесь.
См. Мои комментарии выше: «Как это получило 508/171 голосов и ответ Райана« 11 окт. 2011 в 23:41 ». На сегодняшний день получено только 13 голосов?!? Райан - это только ответ, который отвечает на вопрос оператора. он обрабатывает эти сценарии (которые, кстати, OP НЕ исключил из q.): a) Идентичность (общий очень), b) Ограничения, c) Триггеры, d) Индексы, e) Разрешения, d) копирование схемы и данных (Подсказка: часть «и все» в операторе «(данные и все)» также подразумевает схему.) И е) генерирует «оператор SQL», который указан оператором, который, даже если он не имел в виду, буквально это лучше иметь, чем не иметь ».
Примечание. Этот ответ применим только в том случае, если количество строк не является «чрезмерным» (например, таблицы поиска / малых транзакций) и нет «больших» значений столбца. Для них я бы использовал ответ Райана только для создания сценария для создания таблицы (включая атрибуты столбца и суб-объекты), а затем использовал бы ответ Дэвида Б. «Вставить в выбор». Для отдельных таблиц (вместо Ryan A) вы также можете использовать SSMS, обозреватель объектов, таблицу правой кнопкой мыши, таблицу сценариев как, CREATE To, но вы должны сначала убедиться, что инструменты, параметры, обозреватель объектов SQL Server, параметры сценариев установить по желанию.
Вы можете пойти по этому пути: (общий пример)
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>
Имя сервера указывать необязательно, если обе БД находятся на одном сервере.
Если это только одна таблица, все, что вам нужно сделать, это
Одна вещь, которую вы должны принять во внимание, - это другие обновления, такие как перенос других объектов в будущем. Обратите внимание, что исходная и конечная таблицы имеют разные имена. Это означает, что вам также придется вносить изменения в зависимые объекты, такие как представления, хранимые процедуры и другие.
К одному или нескольким объектам можно перейти вручную без каких-либо проблем. Однако, когда обновлений больше, чем несколько, сторонние инструменты сравнения очень кстати. Прямо сейчас я использую ApexSQL Diff для переноса схемы, но вы не ошибетесь с любым другим инструментом.
Копировать данные
INSERT INTO Alfestonline..url_details(url,[status],recycle)
SELECT url,status,recycle FROM AlfestonlineOld..url_details
Если есть существующая таблица, и мы хотим скопировать только данные, мы можем попробовать этот запрос.
вставить в Destination_Existing_Tbl выберите col1, col2 FROM Source_Tbl
Я полагаю, вам также придется отдельно установить разрешения для таблиц.