Хранимые процедуры и используемые ими таблицы - PullRequest
3 голосов
/ 23 марта 2009

Есть ли способ узнать, какие таблицы используются одной хранимой процедурой, выполнив SQL-запрос?

С уважением, и спасибо за помощь.

П.С .: Я использую SQL Server 2005.

Ответы [ 5 ]

4 голосов
/ 23 марта 2009

Эта статья на TechRepublic

Поиск зависимостей в SQL Server 2005

описывает способ сделать это:

Этот урок покажет, как вы можете написать процедуру, которая будет искать все объекты, которые зависят на другие объекты.

Вот код для создания системной хранимой процедуры поиска объектных зависимостей:

USE master
 GO
 CREATE PROCEDURE sp_FindDependencies
 (
         @ObjectName SYSNAME,
         @ObjectType VARCHAR(5) = NULL
 )
 AS
 BEGIN
     DECLARE @ObjectID AS BIGINT    

         SELECT TOP(1) @ObjectID = object_id
         FROM sys.objects
         WHERE name = @ObjectName
         AND type = ISNULL(@ObjectType, type)    

     SET NOCOUNT ON ;    

       WITH DependentObjectCTE (DependentObjectID, DependentObjectName, ReferencedObjectName, ReferencedObjectID)
         AS
         (
         SELECT DISTINCT
                sd.object_id,
                OBJECT_NAME(sd.object_id),
                ReferencedObject = OBJECT_NAME(sd.referenced_major_id),
                ReferencedObjectID = sd.referenced_major_id
         FROM    
                sys.sql_dependencies sd
                JOIN sys.objects so ON sd.referenced_major_id = so.object_id
         WHERE   
                sd.referenced_major_id = @ObjectID
         UNION ALL
         SELECT
                sd.object_id,
                OBJECT_NAME(sd.object_id),
                OBJECT_NAME(referenced_major_id),
                object_id
         FROM    
                sys.sql_dependencies sd
             JOIN DependentObjectCTE do ON sd.referenced_major_id = do.DependentObjectID       
         WHERE
                sd.referenced_major_id <> sd.object_id     
         )
         SELECT DISTINCT
                DependentObjectName
         FROM   
                DependentObjectCTE c
 END

Эта процедура использует общую таблицу Экспрессия (CTE) с рекурсией к идти вниз по цепочке зависимостей, чтобы получить для всех объектов, которые зависит от объекта, переданного в процедура. Основной источник данных исходит из системного представления sys.sql_dependencies, который содержит информация о зависимости для всех ваших объекты в базе данных.

2 голосов
/ 23 марта 2009

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

1 голос
/ 23 марта 2009

Поиск в системном хранимом протоколе sp_depends.

0 голосов
/ 23 марта 2009

Как указали другие, вы можете использовать хранимые процедуры Dependancies; однако, по моему опыту, и это было еще на SQL Server 2000, депанданты не всегда были надежными. В некоторых случаях они не обновлялись. Вы всегда можете перейти к таблице sysComments, если ваша схема не зашифрована.

declare @crlfSearch varchar(max),@objectSearch varchar(max),@escapeSearch varchar(max)

set @crlfSearch=('%bid' + char(13)+'%')
set @objectSearch='%bid %'
set @escapeSearch ='%[[]Bid]%'
select distinct so.name
from syscomments sc
inner join sysobjects so
on sc.id=so.id
where text like @objectSearch or text like @crlfSearch
or text like @escapesearch

Этот запрос ищет три общих случая, которые вам, возможно, придется добавить, но в основном мы находим, где после имени таблицы есть пробел (это помогает ограничить случаи, когда имя таблицы является частью имени другой таблицы), Имеет вернуть в конце или экранировать в скобках.

0 голосов
/ 23 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...