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

я table a и table b. (SQL Server 2008)

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

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

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

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

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

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

редактировать

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

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

вот идея что?!--7--> может выглядеть так:

IdFoo          Activity      IsFoo
1              Foo           1
2              Bar           0

вот идея чего TABLE B может выглядеть так:

IdFoo          Activity      IsFoo
1              Foo           1
2              Bar           1

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

помните:

  • TABLE A на моей локальной машине
  • TABLE B на сервере

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

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

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

EDIT:

Ok - поэтому я пошел с ответом Олега (сравнение данных VS2010). Быстрый, легкий, и работает Шарм.

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

12 ответов


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

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


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

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

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

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


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

MSDN-MERGE (Transact-SQL)

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


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

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


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

(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 получает все записи из обеих таблиц, для которых нет соответствующей записи в другой таблице.

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

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

обратите внимание, что для этого вам нужен первичный ключ.

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

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

Edit 2:

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


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


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


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


вы также можете попробовать использовать import and export data предоставлено SQL Server 2008. Это довольно прямой способ скопировать все данные из любого места в любое место. Я делаю то же самое и прекрасно работает.


вы можете попробовать наш!--1-->сравнение схем для SQL Server

этот инструмент не является бесплатным (это условно), но вы можете использовать 30-дневную пробную версию бесплатно, а также, у вас есть возможность получить бесплатную лицензию на этот продукт-пожалуйста, обратитесь к нашему страница условий бесплатной лицензии.


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

  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

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

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

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