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
Если вы просто хотите синхронизировать таблицы и не заботитесь о рассмотрении изменений заранее слияние команда может это сделать.
(бесплатно) 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-дневную пробную версию бесплатно, а также, у вас есть возможность получить бесплатную лицензию на этот продукт-пожалуйста, обратитесь к нашему страница условий бесплатной лицензии.
что произойдет, если вы:
- копировать devTableA на prod,
- приостановить зависимости от prodTableB
- переименовать prodTable B в prodTableB1,
- переименовать devTableA в prodTableB
- зависимости переопределить на новый prodTableB
- протестируйте новый 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.