我有一个巨大的数据库,有大约 100 个表和大约 250 个存储过程。我想知道受存储过程子集影响的表列表。例如,我有一个包含 50 个存储过程的列表,共有 250 个,我想知道将受这 50 个存储过程影响的表的列表。除了读取所有存储过程并手动查找表列表之外,还有什么简单的方法可以做到这一点?
PS:我为此使用 SQL Server 2000 和 SQL Server 2005 客户端。
我有一个巨大的数据库,有大约 100 个表和大约 250 个存储过程。我想知道受存储过程子集影响的表列表。例如,我有一个包含 50 个存储过程的列表,共有 250 个,我想知道将受这 50 个存储过程影响的表的列表。除了读取所有存储过程并手动查找表列表之外,还有什么简单的方法可以做到这一点?
PS:我为此使用 SQL Server 2000 和 SQL Server 2005 客户端。
这将是您的 SQL Server 查询:
SELECT
[NAME]
FROM
sysobjects
WHERE
xType = 'U' AND --specifies a user table object
id in
(
SELECT
sd.depid
FROM
sysobjects so,
sysdepends sd
WHERE
so.name = 'NameOfStoredProcedure' AND
sd.id = so.id
)
希望这可以帮助某人。
sp_depends 'StoredProcName'将返回存储过程所依赖的对象名称和对象类型。
编辑: 我更喜欢@KG 的回答。更灵活的恕我直言。
我会在 SQL 2005 中这样做(如果您只希望它用于特定的过程,请取消注释“AND”行):
SELECT
[Proc] = SCHEMA_NAME(p.schema_id) + '.' + p.name,
[Table] = SCHEMA_NAME(t.schema_id) + '.' + t.name,
[Column] = c.name,
d.is_selected,
d.is_updated
FROM sys.procedures p
INNER JOIN sys.sql_dependencies d
ON d.object_id = p.object_id
AND d.class IN (0,1)
INNER JOIN sys.tables t
ON t.object_id = d.referenced_major_id
INNER JOIN sys.columns c
ON c.object_id = t.object_id
AND c.column_id = d.referenced_minor_id
WHERE p.type IN ('P')
-- AND p.object_id = OBJECT_ID('MyProc')
ORDER BY
1, 2, 3
一个非常具有侵略性的选择是获取一个重复的数据库并在每个记录发生的事情的表上设置一个触发器。然后运行所有的SP。如果你不能对数据库做很多不工作的模组
此外,如果您还想要 SP 通过触发器影响的表,请务必将日志记录添加到现有触发器而不是用日志记录替换它们。