Если есть способ сделать это без регулярных выражений, это здорово.Если нет, то вот что у меня получилось:
Я написал простую пользовательскую функцию CLR (которая, как вы можете видеть, я назвал CLR_RegExMatch
), которая выполняет сопоставление регулярных выраженийна предоставленной строке.Я использую его для поиска шаблонов внутри хранимых процедур, триггеров, функций и т. Д.
Вот пример его использования - поиск вставок в таблицу с именем ExampleTable:
SELECT O.name, O.type_desc
FROM
SYS.OBJECTS O
INNER JOIN SYS.SQL_MODULES M ON
M.object_id = O.object_id
AND dbo.CLR_RegExMatch('INSERT\s+(INTO\s+)?ExampleTable\b', M.definition) = 1
Проблема Iу меня есть то, что я не могу придумать шаблон регулярных выражений, чтобы найти все процедуры, которые удаляют строки из данной таблицы.Очевидно, я мог бы заменить следующее на последнюю строку в предыдущем примере:
AND dbo.CLR_RegExMatch('DELETE\s+(FROM\s+)?ExampleTable\b', M.definition) = 1
, и это помогает мне в этом.Однако это не поднимет следующее:
DELETE T1
FROM
ExampleTable T1
INNER JOIN AnotherTable T2 ON T2.ParentId = T1.Id
Итак, я ищу либо шаблон регулярного выражения, который будет соответствовать удаляемым, как указано выше, либо, альтернативно, другой способ добиться этого.NB. Причина, по которой я запрашиваю столбец definition
в SYS.SQL_MODULES
вместо столбца ROUTINE_DEFINITION
в INFORMATION_SCHEMA.ROUTINES
, заключается в том, что последний содержит только первые 4000 символов стандартного определения, тогда как первый содержит полный текст.