T-SQL - Существует ли (свободный) способ сравнить данные в двух таблицах?

Я имею table a и table b. (SQL Server 2008)

Обе таблицы имеют ту же самую схему.

В целях этого вопроса рассмотреть table a = моя локальная dev таблица, table b = живая таблица.

Я должен создать сценарий SQL (содержащий UPDATE/DELETE/INSERT операторы), который обновит таблицу b для совпадения с таблицей a. Этот сценарий будет затем развернут на живой базе данных.

Какие-либо бесплатные инструменты там, которые могут сделать это или еще лучше способ, которым я могу сделать это сам?

Я думаю, что, вероятно, должен сделать некоторый тип соединения на всех полях в таблицах, затем генерировать динамический SQL на основе этого.

У кого-либо есть какие-либо идеи?

Править

Хорошо, мысль я разъяснил бы этот вопрос немного.

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

Вот идея какой TABLE A мог бы быть похожим:

IdFoo          Activity      IsFoo
1              Foo           1
2              Bar           0

Вот идея какой TABLE B мог бы быть похожим:

IdFoo          Activity      IsFoo
1              Foo           1
2              Bar           1

В основном все, что я хочу сделать, обновить это BIT столбец (IsFoo) в TABLE B соответствовать соответствующему значению в TABLE A для того же IdFoo.

Следует иметь в виду:

  • TABLE A находится на моей локальной машине
  • TABLE B находится на живом сервере

Очевидно, у меня есть (надежное) резервное копирование TABLE B на моя локальная машина, которой я должен написать сценарий против, затем запустите скрипт на живом сервере.

Таблица также имеет ссылочную целостность (другие столбцы, которые я не показал). Что означает, что я не могу просто удалить все в TABLE B и сделайте вставку от TABLE A.

Этот сценарий будет однажды прочь. Так никакая потребность сделать вещи как связанный сервер, репликация, и т.д. Цените ответы хотя парни.=)

Править:

Хорошо - таким образом, я пошел с ответом Oleg (Данные VS2010 Выдерживают сравнение). Быстрый, легкий, и работы очарование.

Для не высказывания других ответов являются неправильными. Я ценю все ответы!

8
задан Tom H 13 July 2010 в 15:08
поделиться

6 ответов

В очень простых случаях вы сможете определить в своем локальном SQL Server новый связанный сервер (см. В Microsoft SQL Server Management Studio в разделе «Объекты сервера» / «Связанный сервер») и использовать INNER JOIN и OUTER JOIN , чтобы найти различия между таблицами A и B.

В реальной и более сложной ситуации вы должны принимать во внимание ссылочную целостность, различные внешние ключи и поля идентификации (автоматически добавляемые), существующие в целевой базе данных, поэтому сценарий обновления будет более сложным. Поэтому я рекомендую вам не тратить время на синхронизацию своей базы данных разработчика и производственной базы данных и использовать вместо этого стандартный инструмент. Я использую, например, функции Visual Studio Team Edition 2008 (или Database edition) или Visual Studio 2010 Ultimate edition для сравнения данных в двух базах данных. Работает очень хорошо.

5
ответ дан 5 December 2019 в 05:44
поделиться

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

MSDN - MERGE (Transact-SQL)

(бесплатный) Microsoft SSDT также имеет встроенные средства сравнения и синхронизации данных, хотя он более ограничен, чем платные инструменты, такие как сравнение данных Redgate.

5
ответ дан 5 December 2019 в 05:44
поделиться

Есть SQL Data Compare от RedGate (хотя и не бесплатный), а также SMO и встроенные функции.

Наконец, Wikipedia имеет довольно полный список программного обеспечения.

4
ответ дан 5 December 2019 в 05:44
поделиться

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

(SELECT * FROM TABLE_A
 MINUS
 SELECT * FROM TABLE_B)

 UNION ALL

(SELECT * FROM TABLE_B
 MINUS
 SELECT * FROM TABLE_A)

MINUS будет сравнивать записи поле за полем, затем он отбросит записи из первой таблицы, для которой есть Идентична запись во второй таблице. Это работает следующим образом:

  • Первый MINUS получает все записи из TABLE_A , которых нет в TABLE_B
  • Второй MINUS получает все записи из TABLE_B , которых нет в TABLE_A
  • Union получает все записи из обеих таблиц, для которых нет соответствующей записи в другой таблице.

Теперь вы можете вставить эти записи в какую-нибудь временную таблицу, а затем выполнить вставку / обновление.

В зависимости от ваших потребностей вы можете ограничить список полей для сравнения.

Обратите внимание, что для работы необходим первичный ключ.

Редактировать:
Упс. SQL Server не поддерживает оператор MINUS . Я работал с ORACLE последние полтора года, так что это было автоматически.

Вместо этого можно использовать оператор EXCEPT . См. Эту статью: EXCEPT и INTERSECT (Transact-SQL)

Edit 2:

Re комментарий Scherand :
Если он действительно не может подключиться с локальной машины к живому серверу, он может просто выгрузить TABLE_A и загрузить его на сервер. Так или иначе, цель - изменить данные таблицы на живом сервере.

3
ответ дан 5 December 2019 в 05:44
поделиться

Вы можете использовать генератор сценариев данных, который создает сценарий для вставок, а затем использовать инструменты сравнения файлов, такие как WinMerge, для сравнения файлов и поиска различий. Есть статья о создании скриптов данных в проекте кода: http://www.codeproject.com/KB/database/sqlinsertupdategenerator.aspx

2
ответ дан 5 December 2019 в 05:44
поделиться

Вы также можете попробовать использовать данные импорта и экспорта , предоставляемые SQL Server 2008. Это довольно простой способ скопировать все данные из любого места в любое место. Я делаю то же самое и отлично работает.

0
ответ дан 5 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: