среда, 16 декабря 2009 г.

SQL-полезное (Сравнение текста процедур, представлений, функций и т.д. в двух базах)

Сравнение текста процедур, представлений, функций и т.д. в двух базах
Коллеги из филиала спросили "как понять, какие процедуры изменились?"

К счастью, на том же сервере присутствует база, которую можно считать "эталоном".

В этом случае не нужно применять сторонние утилиты - достаточно одного запроса:

select

isnull(s1.name+'.'+o1.[name], s2.name+'.'+o2.[name]),

case

when o1.[object_id] isnullthen'только во второй'

when o2.[object_id] isnullthen'только в первой'

else'объект изменен'end

from Base1.sys.sql_modules m1

innerjoin Base1.sys.objects o1

on o1.[object_id] = m1.[object_id]

leftjoin Base1.sys.schemas s1

on s1.[schema_id] = o1.[schema_id]

fulljoin Base2.sys.sql_modules m2

innerjoin Base2.sys.objects o2

on o2.[object_id] = m2.[object_id]

leftjoin Base2.sys.schemas s2

on s2.[schema_id] = o2.[schema_id]

on s1.name+'.'+o1.[name] = s2.name+'.'+o2.[name]

whereisnull(m1.definition,'')<>isnull(m2.definition,'+')

Вместо Base1 и Base2 подставить требуемые базы данных, в том числе можно сравнивать определения объектов на linked серверах.