Как найти хранимые процедуры с неверным текстом в syscomments

Похоже, есть несколько хранимых процедур, которые были переименованы в sp_rename, в результате чего системные комментарии остаются со старым именем процесса вместо нового имени процесса.

Таким образом, мои переводы БД не могут быть правильно переданы.

Есть ли способ узнать, какие имена (или любые объекты) имеют несинхронизированные имена?

Или лучше, простой способ найти и исправить их?

1 ответ

Решение

Вы могли бы попробовать

select object_name(id)
from syscomments 
WHERE COLID=1 AND
OBJECTPROPERTY(id, 'isprocedure')=1 and
REPLACE(REPLACE(TEXT,CHAR(13),' '),CHAR(10),' ') 
          NOT LIKE '%CREATE%PROC%'+ object_name(id) + ' %'
AND
(REPLACE(REPLACE(TEXT,CHAR(13),' '),CHAR(10),' ')
          NOT LIKE '%CREATE%PROC%'+ object_name(id) + ']%')

SYS.SQL_MODULES вероятно, будет немного более надежным, если есть риск, что вы получите около 4000 символов комментария до CREATE PROC немного.

Однако более надежное решение, чем сам синтаксический анализ текста, заключается в создании сценария для повторной компиляции всех хранимых процедур. Если вы запустите ниже...

SELECT 'EXEC sp_refreshsqlmodule ''' + 
            quotename(schema_name(schema_id)) + '.' + 
            quotename(object_name(object_id)) + '''' 
FROM sys.procedures

... затем скопируйте и вставьте результаты в окно запросов в студии управления и выполните результирующий сценарий, который выдаст ошибку для тех, чьи имена не синхронизированы.

Это приведет к перекомпиляции всех ваших планов хранимых процедур, поэтому не делайте этого на рабочем сервере, если это проблема.

Отредактировано для предоставления дополнительной информации об ошибке.

Код в ответе выше не следует использовать, если есть вероятность, что sp_rename был использован для обмена определения двух объектов. sp_refreshsqlmodule очевидно, есть ошибка в этой ситуации!

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