2010-04-02 3 views

Répondre

1

Si c'est quelque chose que vous ferez souvent Red Trackers SQL Tracker (non je ne travaille pas pour eux) est un excellent outil. Je pense qu'ils ont une période d'essai si vous voulez l'essayer.

7

Vous pouvez utiliser la sql_dependencies vue:

select OBJECT_NAME(referenced_major_id) as DependantObject 
from sys.sql_dependencies 
where object_id = object_id('YourViewName') 

Pour récupérer de manière récursive les dépendances (fe, si vous sélectionnez d'une vue, cela trouverait les tableaux les autres références de vue):

with deps (child, parent) as (
    select d.object_id, d.referenced_major_id 
    from sys.sql_dependencies d 
    where d.object_id = object_id('YourViewName') 
    union all 
    select d.object_id, d.referenced_major_id 
    from sys.sql_dependencies d 
    inner join deps on deps.parent = d.object_id 
) 
select OBJECT_NAME(parent) 
from deps 

Cette méthode n'est pas infaillible. Par exemple, si vous renommez un objet à l'aide de sp_rename, ses dépendances ne sont pas mises à jour.

+0

Je n'obtiens aucun résultat quand je cours ceci –

+0

Fonctionne bien sur ma machine. Peut-être pourriez-vous poster la définition de la vue? – Andomar

+0

oui cela ne fonctionne que pour les vues que j'ai créées mais pour les autres vues créées par d'autres développeurs (auxquelles j'accède) j'obtiens 0 enregistrements. –

8

Vous pouvez utiliser la fonction sys.dm_sql_referenced_entities pour trouver des objets référencés par une vue spécifiée:

SELECT DISTINCT 
referenced_schema_name , 
referenced_entity_name 
FROM sys.dm_sql_referenced_entities ('Sales.vSalesPersonSalesByFiscalYears', 'OBJECT'); 

enter image description here

En outre, il est le point de vue du système de sys.sql_expression_dependencies où vous pouvez spécifier un nom de table et un type de l'objet de référence:

SELECT 
referencing_object_name = o.name, 
referencing_object_type_desc = o.type_desc 
FROM sys.sql_expression_dependencies se 
INNER JOIN sys.objects o 
ON se.referencing_id = o.[object_id] 
WHERE referenced_entity_name = 'Person' AND o.type_desc = 'View' 

enter image description herePour éviter le travail "manuel", vous pouvez également utiliser ApexSQL Clean, un outil SQL Server capable de trouver toutes les dépendances internes et externes. Dans les résultats Pane sélectionnez un objet et voir tous les objets qui dépendent de l'objet sélectionné et les objets sur lesquels l'objet sélectionné dépend:

enter image description here

Vous pouvez également filtrer les objets et visualiser les dépendances:

enter image description here

Disclaimer: Je travaille pour ApexSQL comme ingénieur support

Hope this helps

0

Vous pouvez le faire en utilisant sys.sql_expression_dependencies dans SQL-server> = 2008 (R1 +)
Note: Cela prendra 30 secondes ou plus.

Si vous voulez seulement les vues, les fonctions supprimer scalaire + valeurs tabulaires ('FN' et 'IF'). Une fonction de valeur table peut être une dépendance d'une vue et vice-versa, et la vue/tvf peut dépendre de fonctions scalaires.

;WITH TFV_Dependencies AS 
(
    SELECT 
     --OBJECT_SCHEMA_NAME(sysdep.referencing_id) AS Referencing_Schema 
     ReferencingO.object_id AS ReferencingObject_Id 
     ,sysschema.name AS Referencing_Schema 
     ,ReferencingO.name AS Referencing_Object_Name 
     ,sysdep.referenced_schema_name AS Referenced_Schema 
     ,sysdep.referenced_entity_name AS Referenced_Object_Name 
     --,ReferencingO.type 
     ,ReferencedO.name AS RefName 
     --,ReferencedO.type AS RefType 
    FROM sys.objects as ReferencingO 

    LEFT JOIN sys.schemas AS sysschema 
     ON sysschema.schema_id = ReferencingO.schema_id 

    LEFT JOIN sys.sql_expression_dependencies AS sysdep 
    LEFT JOIN sys.objects as ReferencedO 
     ON ReferencedO.name = sysdep.referenced_entity_name 
     ON sysdep.referencing_id = ReferencingO.object_id 
     AND ReferencingO.name <> sysdep.referenced_entity_name 
     --AND ReferencedO.type <> 'U' 
     AND ReferencedO.type IN ('IF', 'FN', 'V') 

    WHERE (1=1) 
    --AND ReferencingO.type NOT IN ('PK','F','UQ','SQ','D','IT', 'S') 
    --AND ReferencingO.type IN ('U', 'V', 'FN', 'IF', 'P') 
    AND ReferencingO.type IN ('IF', 'FN', 'V') 
    AND ReferencingO.name NOT IN 
    (
     'dt_adduserobject' 
     ,'dt_droppropertiesbyid' 
     ,'dt_dropuserobjectbyid' 
     ,'dt_generateansiname' 
     ,'dt_getobjwithprop' 
     ,'dt_getobjwithprop_u' 
     ,'dt_getpropertiesbyid' 
     ,'dt_getpropertiesbyid_u' 
     ,'dt_setpropertybyid' 
     ,'dt_setpropertybyid_u' 
     ,'dt_verstamp006' 
     ,'dt_verstamp007' 

     ,'sp_helpdiagrams' 
     ,'sp_creatediagram' 
     ,'sp_alterdiagram' 
     ,'sp_renamediagram' 
     ,'sp_dropdiagram' 

     ,'sp_helpdiagramdefinition' 
     ,'fn_diagramobjects' 
    ) 

) 

,DependencyGroup AS 
( 
    -- base case 
    SELECT 
     ReferencingObject_Id AS ObjectId 
     ,Referencing_Object_Name AS ObjectName 
     ,Referencing_Schema AS ObjectSchema 
     ,1 AS Lvl 
    FROM TFV_Dependencies 
    WHERE 1=1 
    AND Referenced_Object_Name IS NULL 

    -- recursive case 
    UNION ALL 

    SELECT 
     d.ReferencingObject_Id AS ObjectId 
     ,d.Referencing_Object_Name AS ObjectName 
     ,d.Referencing_Schema AS ObjectSchema 
     ,r.Lvl + 1 AS Lvl 
    FROM TFV_Dependencies AS d 
    INNER JOIN DependencyGroup AS r 
     ON r.ObjectName = d.Referenced_Object_Name 
) 
, 
CTE AS 
(
    SELECT TOP 999999999999999999 
     MAX(Lvl) AS Lvl 
     ,ObjectId 
     ,ObjectSchema 
     ,ObjectName 
     --,'DELETE FROM [' + REPLACE(ObjectName, '''', '''''') + ']; ' AS DeleteCmd 
    FROM DependencyGroup 

    GROUP BY ObjectId, ObjectSchema, ObjectName 
) 

SELECT 
    CTE.Lvl 
    ,CTE.ObjectSchema AS SPECIFIC_SCHEMA 
    ,CTE.ObjectName AS SPECIFIC_NAME 
    ,sysSqlModules.definition AS ROUTINE_DEFINITION 
FROM CTE 

LEFT JOIN sys.sql_modules AS sysSqlModules 
    ON sysSqlModules.object_id = CTE.ObjectId 

ORDER BY Lvl, ObjectSchema, ObjectName 

OPTION (MAXRECURSION 0) 
Questions connexes