Скопіюйте таблиці з однієї бази даних в іншу в SQL Server


324

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

Відповіді:


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 (клацніть правою кнопкою миші на ім'я БД, а потім завдання) зробить більшу частину цього для вас. Запустіть його з бази даних, в яку потрібно скопіювати дані.

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

Я цим постійно користуюся, і це працює досить добре.


1
я не можу знайти цей варіант. чи є тут якась конкретна версія?
Неррв

35
Ти не можеш сказати, що це взагалі краща відповідь. Наприклад, автоматизація не може викликатись із сценарію, наприклад. BTW автор запитав спеціально для "..SQL заявки ..". Але звичайно це чудова відповідь, але не краща;).
grizzly

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

4
Це не буде вставляти значення для стовпців ідентичності в SQL Server 2008. Це дозволено лише тоді, коли ви використовуєте список стовпців, а IDENTITY_INSERT увімкнено для таблиці призначення.
Лукас Вілсон-Ріхтер

@Lucas - Ви "наполовину" праві :). Однак перший оператор SQL копіює ВСІ дані, включаючи значення в стовпцях ідентичності. Як я вже сказав, обмеження не створюються. Але вони можуть бути легко скриптовані у вихідній БД та застосовані до БД призначення, як тільки всі дані будуть переміщені.
leoinfo

Друга версія ( INSERT INTO...) працювала для мене в Oracle.
vapcguy

Чи працює це, якщо дві бази даних є на абсолютно різних серверах з різними рядками підключення? Якщо ні, як ви впораєтеся з цим?
Олександр Райан Багетт

46

Якщо це лише один стіл, то все, що вам потрібно зробити - це

  • Визначення таблиці скриптів
  • Створіть нову таблицю в іншій базі даних
  • Оновлення правил, покажчиків, дозволів тощо
  • Імпорт даних (кілька вставок у приклади вже показано вище)

Одне, що вам доведеться врахувати, - це інші оновлення, такі як переміщення інших об'єктів у майбутньому. Зауважте, що у ваших таблицях джерел та пунктах призначення немає одного імені. Це означає, що вам також доведеться вносити зміни, якщо ви залежите від об'єктів, таких як представлення даних, збережені процедури та інші.

З одним або декількома об'єктами ви можете перейти вручну без будь-яких проблем. Однак, коли є декілька оновлень, інструменти порівняння сторонніх розробників дуже зручні. Зараз я використовую ApexSQL Diff для міграції схем, але ви не можете помилитися з будь-яким іншим інструментом там.


23
  1. Сценарій create tableв студії управління, запустіть цей скрипт у бар, щоб створити таблицю. (Клацніть правою кнопкою миші таблицю в Explorer Explorer, таблицю сценаріїв як, create to ...)

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


1
Мені подобається такий підхід. Виберіть * не працюватиме, якщо є стовпець ідентичності, вам потрібно буде чітко вказати назви стовпців. У цьому випадку вам також потрібно буде зробити SET IDENTITY_INSERT TblName ON.
JeremyWeir

16

Ви також можете скористатись майстром створення сценаріїв сценаріїв SQL Server, щоб допомогти в створенні сценаріїв SQL, які можуть виконувати такі дії:

  • скопіюйте схему таблиці
  • будь-які обмеження (ідентичність, значення за замовчуванням тощо)
  • дані всередині таблиці
  • та багато інших варіантів, якщо потрібно

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


Дивіться мої коментарі вище:?!? "Як це отримати 508/171 голосів і Райана" 11 жовтня '11 о 23:41 "Відповідь отримає тільки 13 на сьогоднішній день Райан є єдиним відповідь , що відповідь це д оп в. Повністю . Тому що йому обробляє ці сценарії (які, btw, ОП НЕ виключав зі свого питання): a) Ідентифікація ( дуже поширена), b) Обмеження, c) Тригери, d) Індекси, e) Дозволи, г) Копіювання схеми І даних ( Підказка: "і все" частина оп "(дані та все)" також передбачає схему.) Та д) генерує "оператор SQL", котрий оператор вказав, що навіть якщо він не мав на увазі, це краще мати ніж ні ".
Том

1
Примітка. Цей відповідь практичний лише тоді, коли # рядків не є "надмірними" (тобто таблицями пошуку / малих транзакцій) і не мають "великих" значень стовпців. Для них я б використовував відповідь Райана просто для створення сценарію для створення таблиці (включаючи атрибути стовпців та підметів), а потім використовував відповідь Девіда Б "Вставити у вибір". Для одиночних таблиць (замість A Ryan A) ви також можете використовувати SSMS, Провідник об'єктів, Таблицю правої кнопки миші, Таблицю сценаріїв як, CREATE To, але ви повинні спочатку переконатися, що параметри інструментів, параметрів, SQL Server Object Explorer, сценарії сценаріїв встановити за бажанням.
Том

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>

Ім'я сервера необов’язково, якщо обидві БД є на одному сервері.


1

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

вставити в Destination_Existing_Tbl виберіть col1, col2 ВІД джерела_Tbl


0

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

INSERT INTO Alfestonline..url_details(url,[status],recycle) 
SELECT url,status,recycle FROM AlfestonlineOld..url_details
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.