GVi*_*i82 3 sql t-sql sql-server-2008
我正在使用以下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%'
Run Code Online (Sandbox Code Playgroud)
为了显示使用该表的所有存储过程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'
Run Code Online (Sandbox Code Playgroud)
编辑:以下是如何在没有函数的情况下获取依赖项.(我喜欢这种方法最好)
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'
Run Code Online (Sandbox Code Playgroud)
如果您的具体用途是找到与表名匹配的任何字符串,则以下内容将起作用:
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'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3475 次 |
| 最近记录: |