Как найти хранимые процедуры с неверным текстом в 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
очевидно, есть ошибка в этой ситуации!