2017-02-10 5 views
0

Я хочу найти все прямо или косвенно ссылки на список объектов БД.Найти все хранимые процедуры, которые ссылаются на другую хранимую процедуру

Я использую ниже запросы, но я нашел проблему.

DECLARE @Search varchar(255) 
SET @Search = 'Employee' 

; WITH CTE AS 
(
    SELECT DISTINCT 
     o.name AS Object_Name, o.type_desc 
    FROM 
     sys.sql_modules m 
    INNER JOIN 
     sys.objects o ON m.object_id = o.object_id 
    WHERE 
     m.definition LIKE '%' + @Search + '%' 

    UNION ALL 

    SELECT 
     o.name AS Object_Name, o.type_desc 
    FROM 
     sys.sql_modules m 
    INNER JOIN 
     sys.objects o ON m.object_id = o.object_id 
    INNER JOIN 
     cte AS c ON c.Object_Name = o.name 
) 
SELECT * 
FROM Cte 

Но я получаю сообщение об ошибке:

Msg 530, Level 16, State 1, Line 3
Заявление прекращается. Максимальная рекурсия 100 была исчерпана до завершения заявки.

+3

Возможный дубликат [Максимальная рекурсия 100 исчерпана до завершения заявления] (http://stackoverflow.com/questions/9650045/the-maximum- рекурсия-100-был-был-исчерпала-до того, оператор-завершение) – Prisoner

ответ

0

Вот код, который будет работать

DECLARE @Search varchar(255) 
SET @Search = 'Employee' 

; WITH CTE AS 
(
    SELECT DISTINCT o.name AS Object_Name, o.type_desc 
    FROM sys.sql_modules m 
    INNER JOIN sys.objects o ON m.object_id = o.object_id 
    WHERE m.definition LIKE '%' + @Search + '%' 

    UNION ALL 

    SELECT o.name AS Object_Name, o.type_desc 
    FROM sys.sql_modules m 
    INNER JOIN sys.objects o ON m.object_id = o.object_id 
    , cte AS c 
    WHERE m.definition LIKE '%' + c.Object_Name + '%' 
     AND o.name <> c.Object_Name 
) 
SELECT * 
FROM Cte 
;