如何识别引用特定表的所有存储过程
为了testing目的,我创build了一个开发环境表,有几个sp正在修复这个表。 现在我必须删除这个表格,并且确定所有引用这个表格的sp。 我很难find所有sp的列表。 请通过假设表名是'x'和数据库是sql server 2005来build议一些查询。
SELECT Name FROM sys.procedures WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'
顺便说一句 – 这是这种types的问题一个方便的资源: http : //msdn.microsoft.com/en-us/library/ms345522%28v=SQL.90%29.aspx
以下在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
一个非查询的方法是使用Sql Server Management Studio。
find表格,右键单击并select“查看依赖关系”。
编辑
但是,正如评论者所说,这不是很可靠。
有时上面的查询不会给出正确的结果,有内置的存储过程可用来获取表依赖关系为:
EXEC sp_depends @objname = N'TableName';
以下查询将获取所有存储过程名称以及这些SP的相应定义
select so.name, text from sysobjects so, syscomments sc where so.id = sc.id and UPPER(text) like '%<TABLE NAME>%'
下面的查询是只为表格而不是列的工作
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 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,或者表名是另一个正在使用的表名的子string。 例如,如果您有名为“test”和“test_2”的表,并且您尝试使用“test”searchSP,那么您将得到两者的结果。
SELECT DISTINCT OBJECT_NAME(OBJECT_ID), object_definition(OBJECT_ID) FROM sys.Procedures WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%' GO
这将工作,如果你不得不提到表名。