Подтвердить что ты не робот

Как найти имя хранимой процедуры на основе поиска имени таблицы с использованием SQL Server 2008?

Я хочу найти все хранимые процедуры, в которых используется определенная таблица. В базе данных хранится множество хранимых процедур, поэтому невозможно проверить каждую процедуру.

Можно ли использовать поисковый запрос, чтобы найти хранимые процедуры?

Я пробовал этот код:

SELECT distinct so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '% RejectionReason %'

Где RejectionReason - мое имя таблицы, но оно показывает все процедуры, в которых RejectionReason используется как имя столбца, поэтому это не работает.

4b9b3361

Ответ 1

SELECT o.name, o.type_desc, p.name, p.type_desc
FROM sys.sql_dependencies d
INNER JOIN sys.objects o
    ON d.object_id = o.object_id
INNER JOIN sys.objects p
    ON d.referenced_major_id = p.object_id
    AND o.name = 'RejectionReason'

или

SELECT o.name, t.TABLE_NAME, c.text 
  FROM syscomments c 
  JOIN sysobjects o 
    ON c.id = o.id
  JOIN INFORMATION_SCHEMA.Tables t
    ON  c.text LIKE '%RejectionReason%' 

или

EXEC sp_depends @objname = N'RejectionReason';

если никто из них не поможет вам проверить этот блог: http://blog.sqlauthority.com/2010/02/04/sql-server-get-the-list-of-object-dependencies-sp_depends-and-information_schema-routines-and-sys-dm_sql_referencing_entities/

Ответ 2

Попробуйте использовать бесплатный инструмент RedGate SQL Search.

Ответ 3

Вот кусок кода, который надеется, что он сработает. Просто изменяет имя таблицы, которое зависит от вашего кода.

SELECT DISTINCT so.name 
FROM syscomments sc INNER JOIN sysobjects so on sc.id=so.id 
WHERE sc.text LIKE '%tablename%'

например:.

SELECT DISTINCT so.name 
FROM syscomments sc INNER JOIN sysobjects so on sc.id=so.id 
WHERE sc.text LIKE '%users%'

Вы получите список процедур хранения и отношений в таблице.

Ответ 4

В соответствии с MSDN sp_depends будет удалено в будущих выпусках, если вы его используете, вы можете использовать следующие :

SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('dbo.TableName', 'OBJECT');

Ответ 5

Есть две возможности, о которых я знаю.

Во-первых, SQL Management Studio имеет возможность показывать зависимости. Щелкните правой кнопкой мыши на таблице и выберите View Dependencies Однако это не будет указывать на usps, где tablename встроен в динамический SQL.

Второй вариант - щелкнуть правой кнопкой мыши по базе данных и выбрать Generate Scripts. Следуйте указаниям мастера и script всех usps в новом окне запроса, затем выполните поиск этого имени для вашей таблицы. Это более трудоемко, но найдет все возможности.

Ответ 6

Я предполагаю, что этот script показывает весь зависимый объект таблицы, включая SP.

USE MYDatabase
GO

DECLARE @TableName varchar(100)
SET @TableName = 'mytable'

SELECT
 SourceSchema                  = OBJECT_SCHEMA_NAME(sed.referencing_id)
 ,SourceObject                 = OBJECT_NAME(sed.referencing_id)
 ,ReferencedDB                 = ISNULL(sre.referenced_database_name, DB_NAME())
 ,ReferencedSchema             = ISNULL(sre.referenced_schema_name,
OBJECT_SCHEMA_NAME(sed.referencing_id))
 ,ReferencedObject             = sre.referenced_entity_name
 ,ReferencedColumnID   = sre.referenced_minor_id
 ,ReferencedColumn             = sre.referenced_minor_name
FROM sys.sql_expression_dependencies sed
CROSS APPLY sys.dm_sql_referenced_entities(OBJECT_SCHEMA_NAME(sed.referencing_id)
+ '.' + OBJECT_NAME(sed.referencing_id), 'OBJECT') sre
WHERE sed.referenced_entity_name = @TableName
AND sre.referenced_entity_name = @TableName

для более подробной информации вы можете проверить. http://sqlserverplanet.com/sql-server-2008/find-dependent-objects/

Ответ 7

Я использую следующий SQL script to поиск имен столбцов и текста во всех хранимых процедурах вашей базы данных. Вы также можете использовать его для поиска таблиц в хранимых процедурах.

Укажите термин поиска в переменной @SearchFor (как вы бы использовали его в выражении LIKE, например '%LastName%', чтобы найти столбцы и хранимые процедуры, содержащие LastName).

Он найдет имена столбцов в таблицах, а также текст внутри хранимых процедур. script может даже отображать исходный код SP, если вы установите @SPNameOnly на 0.

    --
    -- Purpose: Search field names in all tables and in stored procedures
    -- Written by Matt
    --

    DECLARE @SearchFor nvarchar(max)='%TableNameOrColumnName%'
    DECLARE @SearchSP bit = 1 -- 1=search in SPs as well
    DECLARE @SPNameOnly bit = 1 -- 1=display only name, not source code of SP

    -- tables
    select '['+table_schema+'].'+'['+table_Name+'].['+column_name+']' [table.column] from information_schema.columns
    where column_name like @SearchFor

    -- stored procedure (source)
    if (@SearchSP=1) begin
        if (@SPNameOnly=1) begin
            select '['+routine_schema+'].['+routine_name+']' as [schema.spname] from information_schema.routines
            where routine_definition like @SearchFor
            and routine_type='procedure'
            order by routine_schema, routine_name
        end else begin
            select routine_schema as [Schema name], routine_name as [Stored proc name], routine_definition as [Source code] from information_schema.routines
            where routine_definition like @SearchFor
            and routine_type='procedure'
            order by routine_schema, routine_name
        end
    end

Ответ 8

Это вернет SP и представления.

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 '%TableName%'

Ответ 9

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

SysComments хранит фактический текст (код) для ваших хранимых процедур и функций. Он содержит поле идентификатора, которое возвращается обратно в поле id в SysObjects.

select so.name, text
from sysobjects so, syscomments sc
where so.id = sc.id
and text like '%RejectionReason%'