2016-10-19 62 views
2

我们有一个在我们的应用程序中使用的51存储过程的列表。查找存储过程列表的所有依赖关系

我需要找出的所有功能,通过这些存储的特效

是否有一个快速的方法来找出我们的存储过程调用被称为名称和存储过程?

我尝试使用sys.dm_sql_referencing_entities如下

SELECT 
referencing_schema_name +'.'+ referencing_entity_name AS ReferencedEntityName, 
referencing_class_desc AS ReferencingEntityDescription 
FROM sys.dm_sql_referencing_entities ('dbo.sp_GetPayRunDetails', 'OBJECT'); 
GO 

,但我希望有检查所有50倍存储的特效,并获得有关其他哪些对象的详细信息(存储的特效和功能的方法),他们称之为......

我不想这样做手工是因为我还需要存储的特效和功能被称为递归的依赖......

+2

这只能在SP中使用* no *动态SQL代码(EXEC'...')时才起作用。您是否在寻找递归依赖关系,例如如果A使用B,而B使用C,那么你是否希望将A看作使用C?表和视图使用情况如何? – Lucero

+0

@Lucero:嗨,感谢您的回复 - 我确实需要递归依赖关系,但我只需要存储特效和此项目的函数。我不认为有任何动态电话 –

+2

只有51 sprocs这会带你什么,手动不到2小时?除非您需要重复执行此操作,否则最好使用您的时间可能只是手动完成。 – iamdave

回答

3

这个查询英里ght为你做伎俩:

WITH cteDependencies AS (
    SELECT e.referencing_id object_id, e.referencing_id, e.referenced_id, e.referenced_schema_name, e.referenced_entity_name 
    FROM sys.sql_expression_dependencies e 
    WHERE e.referencing_id = OBJECT_ID('dbo.sp_GetPayRunDetails') 
    UNION ALL 
    SELECT d.object_id, e.referencing_id, e.referenced_id, e.referenced_schema_name, e.referenced_entity_name 
    FROM sys.sql_expression_dependencies e 
    JOIN cteDependencies d ON d.referenced_id = e.referencing_id AND e.referenced_id <> e.referencing_id 
) 
SELECT OBJECT_NAME(d.object_id) source_name, d.* 
    FROM cteDependencies d 
    JOIN sys.all_objects o ON d.referenced_id = o.object_id 
    WHERE o.[type] IN ('P','FN','TF'); -- for a list of types see https://msdn.microsoft.com/en-us/library/ms178618.aspx?f=255&MSPPError=-2147217396 

请注意,它将在循环引用上失败;如果你有这种情况,你需要跟踪依赖路径(例如在XML列中)并跳过重复的项目。

您可以通过更改OBJECT_ID('dbo.sp_GetPayRunDetails')筛选器以包含要分析的SP来更改“源”。

+0

谢谢,你能否澄清我将把OBJECT_ID('dbo.sp_GetPayRunDetails')'改成** OBJECT_ID('dbo.sp_GetPayRunDetails','sp2','sp3'...)**? –

+1

用'IN(OBJECT_ID('sp1'),OBJECT_ID('sp2'),...)'显式查询SP,或者更加通用的用'JOIN sys.all_objects o ON e.referencing_id = o.object_id AND o。[type] ='P''来获得所有SP。 – Lucero

2

我有一个功能。按照你的方式修改它。它管理自引用

CREATE FUNCTION GetDependents( 
@ObjectName AS SYSNAME  
)  
RETURNS @result TABLE (Seq INT IDENTITY, ObjectName SYSNAME, Hierarchy VARCHAR(128) , objNameStr varchar(max))  
AS  
BEGIN  
;WITH Obj AS ( 

SELECT DISTINCT s.id AS ParentID, s.DepID AS ObjectID, o1.Name AS ParentName, o2.Name AS ChildName,  
     QUOTENAME(sch1.name) + '.' + QUOTENAME(o1.Name) + '(' + RTRIM(o1.type) + ')' COLLATE SQL_Latin1_General_CP1_CI_AS  
     AS ParentObject,  
    QUOTENAME(sch2.name) + '.' + QUOTENAME(o2.Name) + '(' + RTRIM(o2.type) + ')' COLLATE SQL_Latin1_General_CP1_CI_AS AS ObjectName,  
    o2.Name as objNameStr  
FROM sys.sysdepends s  
INNER JOIN sys.all_objects o1 ON s.id = o1.object_id  
INNER JOIN sys.schemas sch1 ON sch1.schema_id = o1.schema_id  
INNER JOIN sys.all_objects o2 on s.DepID = o2.object_id  
INNER JOIN sys.schemas sch2 ON sch2.schema_id = o2.schema_id  
where o2.type not in ('u') and s.id <>s.DepID --Self Reference ko hata... 
), cte AS ( 
SELECT  
0 AS lvl,  
ParentID,  
ObjectId,  
ParentObject,  
ObjectName,  
CAST(ObjectID AS VARBINARY(512)) AS Sort  
, objNameStr  

FROM obj WHERE ParentName = @ObjectName  
UNION ALL  
SELECT  
p.lvl+ 1,  
c.ParentID,  
c.ObjectId,  
c.ParentObject,  
c.ObjectName,  
CAST(p.sort + CAST(c.ObjectID AS VARBINARY(16))  
AS VARBINARY(512)), c.objNameStr  

FROM cte p  
INNER JOIN obj c ON p.ObjectID = c.ParentID  
)  
INSERT INTO @result (ObjectName, Hierarchy,objNameStr)  
SELECT  
ObjectName,  
'|-' + REPLICATE('-',(lvl * 4)) + ObjectName,  
objNameStr  
FROM cte  
ORDER BY Sort  
OPTION (MAXRECURSION 32767);  

RETURN  
END  
+1

请注意,不建议使用“sys.sysdepends”。 https://msdn.microsoft.com/en-us/library/ms190325.aspx – Lucero