我在开发环境上创建了一个表用于测试目的,很少有sp引用此表。现在,我必须删除该表,并标识所有引用此表的sp。我很难找到所有sp的列表。请通过假设表名称为'x'并且数据库为sql server 2005来建议一些查询。
我在开发环境上创建了一个表用于测试目的,很少有sp引用此表。现在,我必须删除该表,并标识所有引用此表的sp。我很难找到所有sp的列表。请通过假设表名称为'x'并且数据库为sql server 2005来建议一些查询。
Answers:
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'
顺便说一句-这是有关此类问题的便捷资源:查询SQL Server系统目录常见问题
ROUTINE_DEFINITION
on 来执行此操作INFORMATION_SCHEMA.ROUTINES
?
set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
以下适用于SQL2008及更高版本。提供存储过程和功能的列表。
select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
from sys.objects o inner join sys.sql_expression_dependencies sd on o.object_id = sd.referenced_id
inner join sys.objects sp on sd.referencing_id = sp.object_id
and sp.type in ('P', 'FN')
where o.name = 'YourTableName'
order by sp.Name
有时上述查询不会给出正确的结果,内置的存储过程可用于获取表依赖关系,如下所示:
EXEC sp_depends @objname = N'TableName';
一种非查询方式是使用Sql Server Management Studio。
找到表,右键单击并选择“查看依赖项”。
编辑
但是,正如评论员所说,它不是很可靠。
以下查询将获取所有存储过程名称以及这些SP的相应定义
select
so.name,
text
from
sysobjects so,
syscomments sc
where
so.id = sc.id
and UPPER(text) like '%<TABLE NAME>%'
SELECT
o.name
FROM
sys.sql_modules sm
INNER JOIN sys.objects o ON
o.object_id = sm.object_id
WHERE
sm.definition LIKE '%<table name>%'
请记住,这还会在表名位于注释中或表名是正在使用的另一个表名的子字符串的情况下打开SP。例如,如果您有名为“ test”和“ test_2”的表,并且尝试使用“ test”搜索SP,则将同时获得这两个结果。
syscomments
对于较长的过程,以这种方式进行查询是不可靠的,因为它将定义分为多行4000个字符的块。sys.sql_modules
避免这种情况。
sys.sql_modules
代替使用。
以下查询仅在搜索表而不是列的依赖项时有效:
EXEC sp_depends @objname = N'TableName';
但是,如果您要搜索各种依赖项,则以下查询是最佳选择,它不会丢失任何内容。实际上,它提供了比所需更多的信息。
select distinct
so.name
--, text
from
sysobjects so,
syscomments sc
where
so.id = sc.id
and lower(text) like '%organizationtypeid%'
order by so.name
您基本上有2个选择:
- - 选项1
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'
----选项2
SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'
这两个查询将为您提供所有引用所需表的存储过程。该查询依赖于2个sys表,即sysobjects和syscomments。sysobjects是存储所有DB对象名称的位置,其中包括存储过程。
syscomments包含所有过程的文本。
如果您查询: SELECT * FROM syscomments
您将拥有一个包含ID的表,该ID是到sysobjects表的映射,其中存储过程中包含的文本作为最后一列。
试试这个
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%your table name%'