SQL Сравнение двух хранимых процедур между базами данных
У меня есть две версии одной и той же базы данных, и мне нужно разместить несколько объектов между ними (хранимые процедуры, представления и т. Д.)
На самом деле я использую SQLDMO-SQLSMO для получения текста каждого объекта, а затем я выполняю сравнение текста. Это эффективно, но у меня уходит больше времени, если у меня больше 1000 и более загар.
Мой вопрос Есть простой способ выполнить это сравнение? может быть ключ MD5, сгенерированный в базах данных?
2 ответа
Почему бы просто не запросить определения непосредственно с SQL-сервера, вместо того чтобы использовать служебные объекты?
SELECT
sysobjects.name AS [Object Name]
,(CASE sysobjects.xtype
WHEN 'P' THEN 'Stored Procedure'
WHEN 'TF' THEN 'Function'
WHEN 'TR' THEN 'Trigger'
WHEN 'V' THEN 'View' END) AS [Object Type]
,syscomments.text AS [Object Definition]
FROM
sysobjects
JOIN
syscomments
ON
sysobjects.id = syscomments.id
WHERE
sysobjects.xtype in ('P', 'TF', 'TR', 'V')
AND
sysobjects.category = 0
Я проверил это по базе данных, которая у меня есть. Он вернул ~1500 определений за 0,6 секунды. Если вы запустите его для каждого сервера, чтобы собрать все определения, вы можете сравнить имя, тип и определение объекта в одном большом цикле.
Это будет дорогостоящая операция с памятью, но должна быть довольно быстрой. Большая часть процессорного времени будет потрачена на сравнение строк.
Что касается ваших других вопросов о "ключе", который вы можете сравнить, то такого хэша или аналога, о котором я знаю, не существует. в sys.syscomments
стол у вас есть ctext
столбец (необработанные байты определения SQL) и text
столбец, который является текстовым представлением этих байтов.
К вашему сведению: если у вас Visual Studio 2010 Premium или выше, есть встроенный инструмент сравнения схем, который сделает все это за вас. Есть также Open DBDiff или многие другие, которые бесплатны.
Я использую контрольную сумму (текст) для сравнения. Но если в самом начале процедур есть возврат каретки или пробел, вы получите неожиданные результаты по сравнению с инструментом сравнения схем Visual Studio.