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