我想找到正在使用特定表的所有存储过程。数据库中有很多存储过程,因此检查每个过程是不可行的。
有没有办法使用搜索查询以便我可以找到存储过程?
我试过这段代码:
SELECT distinct so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '% RejectionReason %'
RejectionReason
是我的表名,但它显示了RejectionReason
用作列名的所有过程,因此不起作用。
答案 0 :(得分:21)
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';
答案 1 :(得分:4)
尝试使用RedGate的免费工具SQL Search。
答案 2 :(得分:3)
这是一段希望它可以工作的代码。只需更改它取决于您的代码的表名
SELECT DISTINCT so.name
FROM syscomments sc INNER JOIN sysobjects so on sc.id=so.id
WHERE sc.text LIKE '%tablename%'
e.g:
SELECT DISTINCT so.name
FROM syscomments sc INNER JOIN sysobjects so on sc.id=so.id
WHERE sc.text LIKE '%users%'
您将获得商店程序列表和表格关系。
答案 3 :(得分:1)
根据MSDN sp_depends
将在以后的版本中删除,以防您使用它,您可以改为使用以下query:
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('dbo.TableName', 'OBJECT');
答案 4 :(得分:0)
我知道有两种可能性。
首先,SQL Management Studio有一个显示依赖关系的选项。右键单击表并选择View Dependencies
但是,这不会突出显示表名嵌入动态SQL的usps。
第二个选项是右键单击数据库并选择Generate Scripts
。按照向导并将所有usps脚本添加到新的查询窗口,然后在其中搜索表的名称。这更费力,但会找到所有用途。
答案 5 :(得分:0)
我想这个脚本会显示表的所有依赖对象,包括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/
答案 6 :(得分:0)
我正在使用以下SQL脚本在数据库的所有存储过程中搜索列名和文本。您也可以使用它来查找存储过程中的表。
在变量 @SearchFor
中指定搜索字词(正如您在LIKE
表达式中使用它一样,例如 '%LastName%'
查找包含 LastName
的列和存储过程。
它将在表中找到列名以及存储过程中的文本。如果将@SPNameOnly
设置为0,脚本甚至可以显示SP源代码。
--
-- Purpose: Search field names in all tables, views stored procedures
--
DECLARE @SearchFor nvarchar(max)='%Search_SP_Or_Table_Or_View%' -- search for this string
DECLARE @SearchSP bit = 1 -- 1=search in SPs as well
DECLARE @DisplaySPSource bit = 1 -- 1=display SP source code
-- tables
if (@SearchSP=1) begin
(
select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object],
t.table_type
from information_schema.columns c
left join information_schema.Tables t on c.table_name=t.table_name
where column_name like @SearchFor or t.table_name like @SearchFor
UNION
select '['+routine_Schema+'].['+routine_Name+']' [schema_object],
'PROCEDURE' as table_type from information_schema.routines
where routine_definition like @SearchFor or routine_name like @SearchFor
and routine_type='procedure'
)
order by table_type, schema_object
end else begin
select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object],
t.table_type
from information_schema.columns c
left join information_schema.Tables t on c.table_name=t.table_name
where column_name like @SearchFor or t.table_name like @SearchFor
order by c.table_Name, c.column_name
end
-- stored procedure (source listing)
if (@SearchSP=1) begin
if (@DisplaySPSource=1) begin
select '['+routine_Schema+'].['+routine_Name+']' [schema.sp], routine_definition
from information_schema.routines
where routine_definition like @SearchFor or routine_name like @SearchFor
and routine_type='procedure'
order by routine_name
end
end
答案 7 :(得分:0)
这将返回SP&#39和s。
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%'
答案 8 :(得分:0)
SysObjects存储有关数据库内所有对象的基本信息。它对您有用,因为它告诉我们每个对象的名称和对象的类型。
SysComments存储存储过程和函数的实际文本(代码)。它包含一个ID字段,该字段映射回SysObjects中的id字段。
select so.name, text
from sysobjects so, syscomments sc
where so.id = sc.id
and text like '%RejectionReason%'