Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

T-SQL :Afficher les procédures stockées liées aux tables, de manière cyclique

Cela utilise le schéma d'informations pour les tables et les procédures stockées. Vous pouvez modifier ou supprimer la condition ROUTINE_TYPE pour ajouter des fonctions, et vous pouvez modifier le type de table pour renvoyer des vues.

Cette réponse produit ses résultats en vérifiant de quelles tables dépend une procédure stockée. Je pense que ce sera un résultat beaucoup plus précis que de vérifier si un nom est dans le texte de la requête. Si la procédure fait référence à un tableau dans une section de commentaire, alors ce résultat ne sera pas retourné dans la première requête, mais le sera dans la seconde et les autres réponses données.

SELECT t.TABLE_NAME, s.ROUTINE_NAME
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.ROUTINES s ON
    s.ROUTINE_NAME IN (SELECT referencing_entity_name 
        FROM sys.dm_sql_referencing_entities(TABLE_SCHEMA + '.' + TABLE_NAME, 'OBJECT'))
    AND s.ROUTINE_TYPE = 'PROCEDURE'
WHERE t.TABLE_TYPE = 'BASE TABLE'

modifier :Voici comment obtenir les dépendances sans la fonction. (J'aime cette méthode la meilleure)

SELECT DISTINCT t.name [TableName], p.name [ProcedureName]
FROM sys.objects t 
LEFT JOIN sys.sql_dependencies d ON
    d.referenced_major_id = t.object_id
LEFT JOIN sys.objects p ON
    p.object_id = d.object_id
    AND p.type = 'p'
WHERE t.type = 'u'

Si votre utilisation spécifique est de trouver n'importe quelle chaîne qui correspond à un nom de table, ci-dessous fonctionnera :

SELECT t.TABLE_NAME, s.ROUTINE_NAME 
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.ROUTINES s 
    ON CHARINDEX(t.TABLE_NAME, s.ROUTINE_DEFINITION) > 0
    AND s.ROUTINE_TYPE = 'PROCEDURE'
WHERE t.TABLE_TYPE = 'BASE TABLE'