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.

Другие вопросы по тегам