db中有很多表和sp.我找到了特定sp(存储过程)中使用的表名.
sp_depends %sp_name%
没有给出欲望的结果.我也用过INFORMATION_SCHEMA.TABLES
,INFORMATION_SCHEMA.ROUTINES
桌子.
但结果并没有完全满足我的要求.
Nul*_*ify 15
;WITH stored_procedures AS (
SELECT
o.name AS proc_name, oo.name AS table_name,
ROW_NUMBER() OVER(partition by o.name,oo.name ORDER BY o.name,oo.name) AS row
FROM sysdepends d
INNER JOIN sysobjects o ON o.id=d.id
INNER JOIN sysobjects oo ON oo.id=d.depid
WHERE o.xtype = 'P')
SELECT proc_name, table_name FROM stored_procedures
WHERE row = 1
ORDER BY proc_name,table_name
Run Code Online (Sandbox Code Playgroud)
Dev*_*art 15
尝试更优雅的方式(但是,它的解决方案仅适用于MS SQL 2008或更高版本) -
SELECT DISTINCT
[object_name] = SCHEMA_NAME(o.[schema_id]) + '.' + o.name
, o.type_desc
FROM sys.dm_sql_referenced_entities ('dbo.usp_test1', 'OBJECT') d
JOIN sys.objects o ON d.referenced_id = o.[object_id]
WHERE o.[type] IN ('U', 'V')
Run Code Online (Sandbox Code Playgroud)
Kyl*_*Mit 13
两个最高投票的答案使用了许多应该避免的弃用表.
这是一个更清洁的方法.
SELECT DISTINCT p.name AS proc_name, t.name AS table_name
FROM sys.sql_dependencies d
INNER JOIN sys.procedures p ON p.object_id = d.object_id
INNER JOIN sys.tables t ON t.object_id = d.referenced_major_id
ORDER BY proc_name, table_name
Run Code Online (Sandbox Code Playgroud)
适用于MS SQL SERVER 2005+
sysdepends
应该换成 sys.sql_dependencies
object_id
而不是id
referenced_major_id
而不是depid
sysobjects
应更注重系统目录视图替换
sys.tables
和sys.procedures
o.xtype = 'p'
(等)此外,实际上不需要CTE,只是为了确保我们只返回每个记录集中的一个.那是什么!ROW_NUMBER()
DISTINCT
-- Complex
WITH MyPeople AS (
SELECT id, name,
ROW_NUMBER() OVER(PARTITION BY id, name ORDER BY id, name) AS row
FROM People)
SELECT id, name
FROM MyPeople
WHERE row = 1
-- Better
SELECT DISTINCT id, name
FROM People
Run Code Online (Sandbox Code Playgroud)这是sql代码
;WITH stored_procedures AS (
SELECT
o.name AS proc_name, oo.name AS table_name,
ROW_NUMBER() OVER(partition by o.name,oo.name ORDER BY o.name,oo.name) AS row
FROM sysdepends d
INNER JOIN sysobjects o ON o.id=d.id
INNER JOIN sysobjects oo ON oo.id=d.depid
WHERE o.xtype = 'P')
SELECT proc_name, table_name FROM stored_procedures
WHERE row = 1
ORDER BY proc_name,table_name
Run Code Online (Sandbox Code Playgroud)
.
有两种方法
----Option 1
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'
----Option 2
SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'
Run Code Online (Sandbox Code Playgroud)
PS:sp_help
和sp_depends
并不总是返回准确的结果.
参考:
KyleMit 的回答是使用一个很快就会被弃用的表格。建议使用 sys.sql_experssion_dependencies 而不是 sys.sql_dependencies,例如,
SELECT DISTINCT p.name AS proc_name, t.name AS table_name
FROM sys.sql_expression_dependencies d
INNER JOIN sys.procedures p ON p.object_id = d.referencing_id
INNER JOIN sys.tables t ON t.object_id = d.referenced_id
ORDER BY proc_name, table_name
Run Code Online (Sandbox Code Playgroud)
这应该适用于 SQL Server 2008+。
我没有足够高的声誉来直接评论引用的答案。
看起来 OP 问题没有完整的答案。上面的大多数答案既没有架构名称,也没有包含存储过程中使用的其他对象(例如函数)。
存储过程中使用的表/视图的完整列表,带有模式名称和对象 ID
SELECT DISTINCT
procObj.[object_id] AS [ProcObjectId],
procSchema.[name] AS [ProcSchema],
procObj.[Name] AS [ProcName],
tableObj.[object_id] AS [TableObjectId],
tableSchema.[name] AS [TableSchema],
tableObj.[Name] AS [TableName]
FROM sys.sql_dependencies AS dep
INNER JOIN sys.objects AS procObj
ON procObj.[object_id] = dep.[object_id]
INNER JOIN sys.schemas AS procSchema
ON procSchema.[schema_id] = procObj.[schema_id]
INNER JOIN sys.objects AS tableObj
ON tableObj.[object_id] = dep.[referenced_major_id]
INNER JOIN sys.schemas AS tableSchema
ON tableSchema.[schema_id] = tableObj.[schema_id]
WHERE procObj.[type] = 'P'
-- using this filter we can control dependent object types
-- e.g. tableObj.[type] IN ('U') - returns tables only
AND tableObj.[type] IN ('V', 'U')
Run Code Online (Sandbox Code Playgroud)
请注意,有一个可以更改的依赖对象类型的过滤器(取决于您想要的输出结果)。类型缩写的完整列表在 这里。