Насколько велики данные и насколько быстрыми являются связи между базами данных и друг с другом (и вами)? Есть ряд идей:
Если данные достаточно малы, чтобы это практично, запустите их SELECT * FROM <table> ORDER BY <pk>
на каждой БД, сохраните результаты в файле с разделителями-запятыми (не выравниваясь по пробелам, поскольку это приводит к значительному увеличению результирующего размера файла) и сравните полученный результат с предпочитаемым вами типом diff Утилита, такая как Winmerge. Таким образом, вы сравниваете абсолютно все данные.
Если базы данных могут видеть друг друга (скорее всего, поскольку они могут работать в качестве партнеров по репликации), а связь между ними достаточно высокая пропускная способность и достаточно низкая задержка, вы можете использовать функциональность связанного сервера (см. Http://msdn.microsoft .com / en-us / library / ms190479.aspx и связанной с ними документацией), чтобы сравнить и сравнить содержимое таблиц в паре операторов SQL (перечисление строк, <table>
которые не имеют одинаковых строк в <linked_server>.<db>..<table>
и наоборот), так же, как вы бы сравнили содержимое двух локальных таблиц. Потенциально это относительно медленный вариант, но он может быть достаточно мощной проверкой для автоматизации.
Если вам нужно использовать контрольные суммы, потому что вы хотите значительно сократить объем данных, которые необходимо передать, используйте HASHBYTES
вместо CHECKSUM
семейства функций, поскольку вы можете использовать хэши лучшего качества, чтобы вы были более уверены, что они получаются равными. Это требует больше ресурсов ЦП, но для больших объемов данных вы будете связаны с вводом / выводом, а не с ЦП, так что многие запасные циклы будут свободными (а для небольших объемов это просто не будет иметь значения).
В качестве середины между сравнением всех данных символьно-символьных данных и сравнением единой контрольной суммы, охватывающей все данные, вы можете экспортировать данные SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>
из каждой базы данных и сравнивать эти результаты, чтобы увидеть, являются ли они идентичными (или SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>
уменьшить объем данных текущий, но наличие PK в выводе будет означать, что вы можете идентифицировать строки, которые отличаются, если таковые имеются, с меньшим количеством дальнейших запросов). Конечно, этот последний вариант не имеет смысла, если данные в средней строке меньше, чем результирующий хеш, в этом случае опция «сравнить все » будет более эффективной.