Как найти имя хранимой процедуры на основе поиска имени таблицы с использованием 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
используется как имя столбца, поэтому это не работает.
Ответы
Ответ 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%'