2008-09-23 10 views
7

J'ai une énorme base de données avec 100 de tables et de procédures stockées. À l'aide de SQL Server 2005, comment puis-je obtenir une liste des procédures stockées qui effectuent une opération d'insertion ou de mise à jour sur une table donnée.Liste des procédures stockées du tableau

Répondre

10
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%' 

Cela vous donnera une liste de tous les contenus de la procédure stockée avec INSERT ou UPDATE en eux pour une table particulière (vous pouvez évidemment modifier la requête en fonction). Des procédures plus longues seront également interrompues sur plusieurs lignes dans le jeu d'enregistrements renvoyé. Vous devrez peut-être faire un peu de recherche manuelle dans les résultats.

Modifier: Requête modifiée pour renvoyer le nom du SP. En outre, notez que la requête ci-dessus retournera toutes les fonctions UDF ainsi que les SP.

+0

cela me donne l'ID SP ... puis-je atteindre le nom SP avec cet ID? – Vinodtiru

+0

Oui, j'ai modifié la requête pour l'inclure. Je vois qu'il y a maintenant quelques autres réponses qui vous seront utiles. –

+0

Ma réponse ici: http://stackoverflow.com/questions/119679/list-of-stored-procedure-from-table#119719 est presque identique (renvoie le nom). Cependant, je pense que Luke a raison de dire qu'il n'est pas nécessaire d'utiliser DISTINCT comme dans ma réponse –

1

Vous pouvez essayer d'exporter toutes vos procédures stockées dans un fichier texte, puis effectuer une recherche simple.

Une technique plus avancée serait d'utiliser une recherche regexp pour trouver toutes les entrées SELECT FROM et INSERT FROM.

0
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 

This link a été utilisé comme ressource pour la recherche SP.

2

Utilisez sys.dm_sql_referencing_entities

Notez que sp_depends est. Obsoleted

MSDN Reference

1

Cela semble fonctionner:

select
so.name as [proc],
so2.name as [table],
sd.is_updated
from sysobjects so
inner join sys.sql_dependencies sd on so.id = sd.object_id
inner join sysobjects so2 on sd.referenced_major_id = so2.id
where so.xtype = 'p' -- procedure
and is_updated = 1 -- proc updates table, or at least, I think that's what this means

14

sys.sql_dependencies a une liste d'entités avec dépendances, y compris les tables et les colonnes qu'un sproc inclut dans les requêtes. Voir this post pour un exemple de requête qui extrait 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' 
+0

La [MSDN Library] (http://msdn.microsoft.com/en-us/library/ms174402.aspx) indique que cela est maintenant obsolète et doit être remplacé par sys.sql_expression_dependencies. Malheureusement, je ne peux pas obtenir l'équivalent pour travailler. Dans la requête affichée dans la réponse, d.object_id n'existe plus. J'ai essayé d.referencing_id mais cela n'a pas fonctionné non plus. Une idée de comment utiliser sql_expression_dependencies? – Drew

+1

Sur 'sys.sql_expression_dependencies',' referencing_id' est l'élément qui référence la cible, et 'referenced_id' est la dépendance. La table a également des noms de schéma et d'entité pour les entités référencées dans la table. Les ID mineurs se réfèrent aux numéros de colonne, avec 0 indiquant aucune référence de colonne particulière. – ConcernedOfTunbridgeWells

+0

Je pense que j'ai tout ça. Je pense que le problème est que toutes mes lignes sql_expression_dependencies ont un 0 pour referenced_minor_id. La requête analogue de sql_dependencies a retourné plusieurs lignes non nulles et je suis surpris que les résultats soient aussi différents qu'ils le sont. Il semble que sql_expression_dependencies soit beaucoup moins utile car je veux souvent voir quels sprocs référencent une colonne spécifique. Pour référence, j'ai fait un compte select (*) des deux où référencé_minor_id <> 0. Il y a 38119 lignes dans sql_dependencies, et 112 dans sql_expression_dependencies. – Drew

Questions connexes