T-SQL - существует ли (бесплатный) способ сравнения данных в двух таблицах? - PullRequest
8 голосов
/ 10 июня 2010

У меня есть table a и table b. (SQL Server 2008)

Обе таблицы имеют одинаковую схему.

Для целей этого вопроса рассмотрим table a = мою локальную таблицу разработчиков, table b = живую таблицу.

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

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

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

У кого-нибудь есть идеи?

EDIT

Хорошо, подумал, что немного проясню этот вопрос.

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

Вот идея того, как 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.

Этот скрипт будет разовым. Поэтому нет необходимости делать такие вещи, как связанный сервер, репликация и т. Д. Оцените ответы, ребята. =)

EDIT:

Ладно. Итак, я пошел с ответом Олега (Сравнение данных VS2010). Быстро, легко и работает заклинание.

Не сказать, что другие ответы неверны. Я ценю все ответы!

Ответы [ 12 ]

6 голосов
/ 22 июня 2016

Поздний ответ, но может быть полезным для посетителей потока

Помимо других упомянутых решений, я могу предложить попробовать ApexSQL Data Diff.Он может сравнивать и синхронизировать данные базы данных SQL Server (как в действующих базах данных, так и в резервных копиях), а также автоматизировать и планировать миграцию данных.Он также работает с огромными базами данных и может выполнять сравнения непосредственно из SSMS.

Вы можете бесплатно загрузить этот инструмент и поиграть с ним.Он предлагает полнофункциональную бесплатную пробную версию и предлагает версию для сообщества (после окончания пробного периода), которая работает с SQL Express и базой данных SQL Azure.

Чтобы узнать больше об этом инструменте, посетите http://www.apexsql.com/sql_tools_datadiff.aspx

5 голосов
/ 10 июня 2010

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

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

5 голосов
/ 10 июня 2010

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

MSDN - MERGE (Transact-SQL)

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

4 голосов
/ 10 июня 2010

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

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

3 голосов
/ 01 ноября 2012

Я столкнулся с той же проблемой, что и вы, - искал бесплатный инструмент для сравнения данных из двух таблиц MS SQL - и ничего не нашел. Затем я создал простую бесплатную утилиту командной строки. Он сравнивает данные из двух таблиц и создает INSERT/DELETE/UPDATE состояний, чтобы сделать данные таблицы назначения такими же, как в источнике. Сейчас я использую его для сравнения данных, и, поскольку он абсолютно бесплатный, могу порекомендовать проверить его по адресу: Sourceforge.net - UltraDBC

3 голосов
/ 10 июня 2010

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

(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.См. Эту статью: ЗА ИСКЛЮЧЕНИЕМ и ИНТЕРСЕКТОМ (Transact-SQL)

Редактировать 2:

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

2 голосов
/ 10 июня 2010

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

1 голос
/ 04 октября 2011

Tablediff будет работать - это бесплатно и поставляется с SQL Server http://msdn.microsoft.com/en-us/library/ms162843.aspx

0 голосов
/ 20 октября 2016

Вы также можете взглянуть на Сравнение данных xSQL . Версия SQL Express бесплатна, и есть версия Lite, которая подойдет для небольших баз данных.

Хорошим бесплатным инструментом является также сравнение данных с SSDT .

Отказ от ответственности: я связан с xSQL.

0 голосов
/ 18 апреля 2013

что произойдет, если вы:

  1. скопируйте devTableA на prod,
  2. приостановите зависимости от prodTableB
  3. переименуйте prodTable B в prodTableB1,
  4. переименуйте devTableA в prodTableB
  5. переопределите зависимости для нового prodTableB
  6. , протестируйте новый prodTableB и затем удалите устаревший старый prodTableB

?

или еслиВы должны более уважительно относиться к существующим значениям prodTableB и столбцам идентификаторов в соответствии с dev и prod (даже если значения не являются непрерывными) ...

declare @iLast int, @x int, @y int
select @iLast = (select MAX(id) from prodTableB)
set @x = 1
while @x <= @iLast
begin
  select @y = (select COUNT(*) from prodTableB where id = @x)
  if @y = 1
    begin
      update prodTableB set isFoo = (select isFoo from devTableA where id=@x
    end
  @x=@x+1
end
...