【发布时间】:2011-11-08 11:40:09
【问题描述】:
我在开发环境中创建了一个表用于测试目的,并且很少有 sp 正在重新定义该表。现在我必须删除这个表以及识别所有引用这个表的 sp。我很难找到所有 sp 的列表。请通过假设表名是“x”和数据库是 sql server 2005 来建议一些查询。
【问题讨论】:
-
致专家:非 MS SQL 服务器怎么样?
标签: sql tsql sql-server-2005
我在开发环境中创建了一个表用于测试目的,并且很少有 sp 正在重新定义该表。现在我必须删除这个表以及识别所有引用这个表的 sp。我很难找到所有 sp 的列表。请通过假设表名是“x”和数据库是 sql server 2005 来建议一些查询。
【问题讨论】:
标签: sql tsql sql-server-2005
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'
顺便说一句——对于这类问题,这里有一个方便的资源:Querying the SQL Server System Catalog FAQ
【讨论】:
INFORMATION_SCHEMA.ROUTINES 上的ROUTINE_DEFINITION 是否有任何理由这样做?
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>%'
请记住,这也会出现表名在 cmets 中或表名是正在使用的另一个表名的子字符串的 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
【讨论】:
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'
GO
如果您必须提及表名,这将起作用。
【讨论】:
你基本上有两个选择:
----选项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 和 syscmets。 sysobjects 是存储所有数据库对象名称的地方,包括存储过程。
syscmets 包含所有过程的文本。
如果您查询: 从系统中选择 *
您将拥有一个包含 id 的表,该表是到 sysobjects 表的映射,其中存储过程中包含的文本作为最后一列。
【讨论】:
如果你使用 Azure SQL / Synapse Anlaytics,这个有用的查询也可以工作
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 '%Table_Name%'
【讨论】:
试试这个
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%your table name%'
【讨论】:
SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'
【讨论】: