我正在使用以下 t-sql 代码:
USE [my_database]
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%table_name%'
为了显示所有使用该表的存储过程table_name
。
我想为我的数据库中的所有表做这项工作。
如何执行此任务并组织输出?
我正在使用以下 t-sql 代码:
USE [my_database]
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%table_name%'
为了显示所有使用该表的存储过程table_name
。
我想为我的数据库中的所有表做这项工作。
如何执行此任务并组织输出?
这对表和存储过程都使用了信息模式。您可以更改或摆脱 ROUTINE_TYPE 条件以添加功能,您可以更改表类型以返回视图。
这个答案通过检查存储过程所依赖的表来产生结果。我认为这将是一个更准确的结果,然后检查名称是否在查询文本中。如果该过程引用了注释部分中的表,则此结果将不会在第一个查询中返回,但将在第二个和其他给出的答案中返回。
SELECT t.TABLE_NAME, s.ROUTINE_NAME
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.ROUTINES s ON
s.ROUTINE_NAME IN (SELECT referencing_entity_name
FROM sys.dm_sql_referencing_entities(TABLE_SCHEMA + '.' + TABLE_NAME, 'OBJECT'))
AND s.ROUTINE_TYPE = 'PROCEDURE'
WHERE t.TABLE_TYPE = 'BASE TABLE'
编辑:这是在没有函数的情况下获取依赖项的方法。(我最喜欢这种方法)
SELECT DISTINCT t.name [TableName], p.name [ProcedureName]
FROM sys.objects t
LEFT JOIN sys.sql_dependencies d ON
d.referenced_major_id = t.object_id
LEFT JOIN sys.objects p ON
p.object_id = d.object_id
AND p.type = 'p'
WHERE t.type = 'u'
如果您的特定用途是查找与表名匹配的任何字符串,则以下将起作用:
SELECT t.TABLE_NAME, s.ROUTINE_NAME
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.ROUTINES s
ON CHARINDEX(t.TABLE_NAME, s.ROUTINE_DEFINITION) > 0
AND s.ROUTINE_TYPE = 'PROCEDURE'
WHERE t.TABLE_TYPE = 'BASE TABLE'
你可以做JOIN
一个LIKE
:
select * from INFORMATION_SCHEMA.TABLES t
join
(
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
) x on x.name like '%' + t.TABLE_NAME + '%'
请注意,您的查询不限于 procs - 您还将获得视图、默认值和其他对象。如果您只想要 procs,您可以添加where so.xtype = 'P'
到您的内部查询。
另一个只使用sys
表格的版本:
select t.name as TableName, p.name as SPName
from sys.objects t
join sys.syscomments c
on c.text like '%' + t.name + '%'
join sys.objects p
on p.object_id = c.id
where t.type = 'U' -- user table
and p.type = 'P' -- procedure
您还可以使用至少从 SQL 2005 开始就存在的内置函数,它适用于表、视图和存储过程。在检查相当企业数据库中表的依赖关系时,我得到与丹尼尔上面的答案相同数量的结果。
sp_depends [TableName]
sp_depends [TableName.Column]
sp_depends [StoredProcedureName]
http://msdn.microsoft.com/en-us/library/ms189487(v=sql.90).aspx