Как я могу искать хранимые процедуры, выполняя другие хранимые процедуры? - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть список из примерно 350 хранимых процедур, таких как:

usp_SP1,
usp_SP2
...

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

Полагаю, я бы искал строку типа «exec что-то» в каждом из них или в конкретном имени базы данных.ех.some_other_database

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

Я могу запустить это ниже, но он находит только текст.Есть ли способ, которым я могу гарантировать, что это вызов exec, а не просто текст?

USE [Your_DB];
GO

SELECT 
    ROUTINE_NAME, ROUTINE_DEFINITION
FROM 
    INFORMATION_SCHEMA.ROUTINES 
WHERE 
    ROUTINE_DEFINITION LIKE '%exec %' 
    AND ROUTINE_TYPE = 'PROCEDURE'
    AND ROUTINE_NAME IN ('usp_SP1', 'usp_SP2')
GO

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

Вы можете запросить представление sys.sql_dependencies , например:

SELECT o1.name AS CallerSP, o2.name AS CalledSP
FROM sys.sql_dependencies sd
INNER JOIN sys.objects o1 ON o1.object_id = sd.object_id
INNER JOIN sys.objects o2 ON o2.object_id = sd.referenced_major_id
WHERE o1.type='P' AND o2.type='P'

Вам может потребоваться вызвать sp_refreshsqlmodule для всех объектов перед выполнением этого запроса, если вызываемый SP был создан после вызывающей стороны.

Другими вариантами могут быть запросы к представлению sys.sql_expression_dependencies или функции sys.dm_sql_referenced_entities .

0 голосов
/ 04 апреля 2019

Не борись, Разван Сокол прав.Добавление способов сделать это в более ранней версии до 2000 года. Все старые таблицы и представления по-прежнему могут выполнять запросы, даже если они не видны в ssms.

select distinct /* I believe the sys.sys views were added in 2012 or so, still works in 2017  */
     od.name caller_procedure_name
    ,o.name called_procedure_name
from sys.sysdepends d
inner join sys.sysobjects o on o.id = d.depid and o.type = 'P'
inner join sys.sysobjects od on od.id = d.id and od.type = 'P'

select distinct /* should work all the way back to sql 2000, still works in 2017 */
     od.name caller_procedure_name
    ,o.name called_procedure_name
from dbo.sysdepends d
inner join dbo.sysobjects o on o.id = d.depid and o.type = 'P'
inner join dbo.sysobjects od on od.id = d.id and od.type = 'P'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...