存储过程及其使用的表

时间:2009-03-23 12:49:19

标签: sql sql-server sql-server-2005

有没有办法通过执行SQL查询来了解一个存储过程使用的表是什么?

致以最诚挚的问候,并感谢您的帮助。

P.S。:我正在使用SQL Server 2005。

5 个答案:

答案 0 :(得分:4)

TechRepublic上的这篇文章

Finding dependencies in SQL Server 2005

描述了一种方法:

  

本教程将向您展示如何做到   写一个会查找的程序   所有依赖的对象   在其他对象上。

以下是创建用于查找对象依赖项的系统存储过程的代码:

USE master
 GO
 CREATE PROCEDURE sp_FindDependencies
 (
         @ObjectName SYSNAME,
         @ObjectType VARCHAR(5) = NULL
 )
 AS
 BEGIN
     DECLARE @ObjectID AS BIGINT    

         SELECT TOP(1) @ObjectID = object_id
         FROM sys.objects
         WHERE name = @ObjectName
         AND type = ISNULL(@ObjectType, type)    

     SET NOCOUNT ON ;    

       WITH DependentObjectCTE (DependentObjectID, DependentObjectName, ReferencedObjectName, ReferencedObjectID)
         AS
         (
         SELECT DISTINCT
                sd.object_id,
                OBJECT_NAME(sd.object_id),
                ReferencedObject = OBJECT_NAME(sd.referenced_major_id),
                ReferencedObjectID = sd.referenced_major_id
         FROM    
                sys.sql_dependencies sd
                JOIN sys.objects so ON sd.referenced_major_id = so.object_id
         WHERE   
                sd.referenced_major_id = @ObjectID
         UNION ALL
         SELECT
                sd.object_id,
                OBJECT_NAME(sd.object_id),
                OBJECT_NAME(referenced_major_id),
                object_id
         FROM    
                sys.sql_dependencies sd
             JOIN DependentObjectCTE do ON sd.referenced_major_id = do.DependentObjectID       
         WHERE
                sd.referenced_major_id <> sd.object_id     
         )
         SELECT DISTINCT
                DependentObjectName
         FROM   
                DependentObjectCTE c
 END
  

此过程使用公用表   递归的表达式(CTE)   走下依赖链来获取   对所有的对象   依赖于传入的对象   程序,流程。数据的主要来源   来自系统视图   sys.sql_dependencies,包含   所有人的依赖信息   数据库中的对象。

答案 1 :(得分:2)

尝试sp_depends,尽管您应该重新编译存储过程以更新数据库中的统计信息。

答案 2 :(得分:1)

查找sp_depends系统存储过程。

答案 3 :(得分:0)

我认为只要存储过程和表都在同一个数据库中,您就可以右键单击SSMS中的过程并单击“查看依赖项”。我不知道对话背后的查询......

答案 4 :(得分:0)

正如其他人所说,您可以使用Dependancies存储过程;但是,根据我的经验,这又回到了SQL Server 2000上,但是这种情况并不总是可靠的。在某些情况下,他们没有得到更新。假设您的架构未加密,您可以随时转到sysComments表。

declare @crlfSearch varchar(max),@objectSearch varchar(max),@escapeSearch varchar(max)

set @crlfSearch=('%bid' + char(13)+'%')
set @objectSearch='%bid %'
set @escapeSearch ='%[[]Bid]%'
select distinct so.name
from syscomments sc
inner join sysobjects so
on sc.id=so.id
where text like @objectSearch or text like @crlfSearch
or text like @escapesearch

此查询查找三种常见情况,您可能需要添加一些但基本上我们找到表名后面有空格的位置,(这有助于限制表名是另一个表名的一部分的情况),有一个在它的末尾返回,或在括号内转义。