3

我正在使用以下 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

我想为我的数据库中的所有表做这项工作。

如何执行此任务并组织输出?

4

4 回答 4

6

这对表和存储过程都使用了信息模式。您可以更改或摆脱 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'
于 2013-07-01T15:06:07.673 回答
1

你可以做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'到您的内部查询。

于 2013-07-01T14:52:58.947 回答
1

另一个只使用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 
于 2013-07-01T14:56:38.977 回答
1

您还可以使用至少从 SQL 2005 开始就存在的内置函数,它适用于表、视图和存储过程。在检查相当企业数据库中表的依赖关系时,我得到与丹尼尔上面的答案相同数量的结果。

sp_depends [TableName]

sp_depends [TableName.Column]

sp_depends [StoredProcedureName]

http://msdn.microsoft.com/en-us/library/ms189487(v=sql.90).aspx

于 2014-11-17T20:06:18.317 回答