Comment identifier toutes les procédures stockées faisant référence à une table particulière


136

J'ai créé une table sur l'environnement de développement à des fins de test et il y a peu de sp qui refreing cette table. Maintenant, je dois supprimer ce tableau et identifier tous les SP qui font référence à ce tableau. Je suis confronté à des difficultés pour trouver la liste de tous les sp. Veuillez suggérer une requête en supposant que le nom de la table est «x» et que la base de données est SQL Server 2005.




1
aux experts: que diriez-vous d'un serveur SQL non MS?
Deian le

Réponses:


259
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

BTW - voici une ressource pratique pour ce type de question: Interrogation de la FAQ du catalogue système SQL Server


3
Y a-t-il une raison de faire cela en accédant au ROUTINE_DEFINITIONon INFORMATION_SCHEMA.ROUTINES?
Marie

1
@Marie - SQL-Server 2005 (AFAIK) n'a pas cela.
Chaînes

2
Question, cette solution trouve-t-elle des objets référencés lorsqu'ils sont référencés à l' intérieur d'une chaîne? comme,set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark

1
@ Jeff.Clark - Il existe un moyen facile de le savoir :-) - mais oui, il recherche directement le texte de la procédure, donc il le trouvera.
Chaînes

2
ouais ouais :) Cela allait me prendre un certain temps pour mettre en place le test, et je cherchais juste une réponse paresseuse / facile :)
Jeff.Clark

27

Ce qui suit fonctionne sur SQL2008 et au-dessus. Fournit une liste des procédures stockées et des fonctions.

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name

1
OP a besoin de la réponse pour SQL-Server-2005
Chains

19

Parfois, les requêtes ci-dessus ne donneront pas de résultat correct, il existe une procédure stockée intégrée disponible pour obtenir les dépendances de table comme:

EXEC sp_depends @objname = N'TableName';

1
Pour moi, cela montrait des déclencheurs et des vues mais pas des processus stockés.
NealWalters

1
REMARQUE: j'ai exécuté ceci sur un système où j'avais accès aux tables, mais pas aux processus stockés, donc bien sûr, les processus stockés ne figuraient pas dans le résultat.
NealWalters

18

Une manière sans requête serait d'utiliser le Sql Server Management Studio.

Localisez la table, faites un clic droit et choisissez "Afficher les dépendances".

ÉDITER

Mais, comme l'ont dit les commentateurs, ce n'est pas très fiable.


4
En 2005, les informations sur les dépendances ne sont pas fiables si les objets ne sont pas créés dans le bon ordre.
Martin Smith

3
Comme @Martin Smith l'a noté, une procédure stockée référençant un objet inexistant sera créée, bien qu'avec un avertissement, mais aucune entrée ne sera placée dans sysdepends. Il en va de même pour les procédures stockées référençant une table dans une base de données étrangère: aucune entrée n'est jamais placée dans sysdepends dans l'une ou l'autre base de données. Une autre caractéristique est que supprimer / recréer une table ou une vue rompt la chaîne de dépendances. Ces fonctionnalités ... err ... rendent le suivi des dépendances de SQL Server pratiquement inutile.
Nicholas Carey

7

La requête suivante récupérera tous les noms de procédure stockée et la définition correspondante de ces SP

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'

5
SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

Gardez simplement à l'esprit que cela affichera également les SP où le nom de la table se trouve dans les commentaires ou où le nom de la table est une sous-chaîne d'un autre nom de table utilisé. Par exemple, si vous avez des tables nommées "test" et "test_2" et que vous essayez de rechercher des SP avec "test", vous obtiendrez des résultats pour les deux.


2
L'interrogation syscommentsde cette manière n'est pas fiable pour les procédures longues car elle divise la définition en blocs de 4 000 caractères sur plusieurs lignes. sys.sql_modulesévite cela.
Martin Smith

1
Bon point. Je l'ai mis à jour pour l'utiliser à la sys.sql_modulesplace.
Tom H

3
syscomments a été démystifié dans chacune de mes douzaines de réponses à la même question stackoverflow.com/...
gbn

5

La requête ci-dessous fonctionne uniquement lors de la recherche de dépendances sur une table et non sur celles d'une colonne:

EXEC sp_depends @objname = N'TableName';

Cependant, la requête suivante est la meilleure option si vous souhaitez rechercher toutes sortes de dépendances, elle ne manque rien. Il donne en fait plus d'informations que nécessaire.

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name

1
Pour moi, je n'ai rien retourné sur SSMS 2014 en cours d'exécution sur la base de données sur SQL Server 12.0)
NealWalters

3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

Cela fonctionnera si vous devez mentionner le nom de la table.


3

Dans le studio de gestion, vous pouvez simplement cliquer avec le bouton droit sur le tableau et cliquer sur `` Afficher les dépendances '' entrez la description de l'image ici

que vous pouvez voir une liste d'objets qui ont des dépendances avec votre table:entrez la description de l'image ici


1

Vous avez essentiellement 2 options:

----Option 1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

----Option 2

SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

Ces 2 requêtes vous permettront d'obtenir toutes les procédures stockées qui font référence à la table que vous désirez. Cette requête repose sur 2 tables sys qui sont des sysobjects et des syscomments. Le sysobjects est l'endroit où tous vos noms d'objet de base de données sont stockés, y compris les procédures stockées.

Les syscomments contiennent le texte de toutes vos procédures.

Si vous interrogez: SELECT * FROM syscomments

Vous aurez une table contenant l'id qui est le mappage à la table sysobjects avec le texte contenu dans les procédures stockées comme dernière colonne.


0

Essaye ça

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.