Liste des procédures stockées du tableau
-
02-07-2019 - |
Question
J'ai une énorme base de données avec des centaines de tables et de procédures stockées. À l’aide de SQL Server 2005, comment obtenir une liste des procédures stockées effectuant une opération d’insertion ou de mise à jour sur une table donnée.
La solution
select
so.name,
sc.text
from
sysobjects so inner join syscomments sc on so.id = sc.id
where
sc.text like '%INSERT INTO xyz%'
or sc.text like '%UPDATE xyz%'
Ceci vous donnera une liste de tous les contenus de procédures stockées avec INSERT ou UPDATE pour une table particulière (vous pouvez évidemment ajuster la requête en conséquence). De plus, les procédures plus longues seront fractionnées sur plusieurs lignes dans le jeu d’enregistrements renvoyé. Vous devrez donc peut-être effectuer une petite sélection manuelle des résultats.
Modifier : modification de la requête pour renvoyer le nom du fournisseur de services. Notez également que la requête ci-dessus renvoie tous les fichiers UDF ainsi que les SP.
Autres conseils
sys.sql_dependencies
contient une liste d'entités avec des dépendances, y compris des tables et des colonnes qu'un sproc inclut dans les requêtes. Voir cette publication pour un exemple de requête générant des dépendances. L'extrait de code ci-dessous obtiendra une liste des dépendances table / colonne par procédure stockée
select sp.name as sproc_name
,t.name as table_name
,c.name as column_name
from sys.sql_dependencies d
join sys.objects t
on t.object_id = d.referenced_major_id
join sys.objects sp
on sp.object_id = d.object_id
join sys.columns c
on c.object_id = t.object_id
and c.column_id = d.referenced_minor_id
where sp.type = 'P'
Vous pouvez essayer d'exporter toutes vos procédures stockées dans un fichier texte, puis utiliser une recherche simple.
Une technique plus avancée consisterait à utiliser une recherche d'expression rationnelle pour trouver toutes les entrées SELECT FROM et INSERT FROM.
Cela semble fonctionner:
sélectionnez
so.name as [proc],
so2.name as [table],
sd.is_updated
de sysobjects donc
jointure interne sys.sql_dependencies sd sur so.id = sd.object_id
jointure interne sysobjects so2 sur sd.referenced_major_id = so2.id
où so.xtype = 'p' - procédure
et is_updated = 1 - table de mises à jour proc, ou du moins, je pense que c'est ce que cela signifie
Si vous téléchargez sp_search_code depuis le site Web de Vyaskn, vous pourrez rechercher du texte dans vos objets de base de données.
SELECT Distinct SO.Name
FROM sysobjects SO (NOLOCK)
INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID
AND SO.Type = 'P'
AND (SC.Text LIKE '%UPDATE%' OR SC.Text LIKE '%INSERT%')
ORDER BY SO.Name
Ce lien a été utilisé comme ressource pour la recherche de SP.