2009-10-01 6 views
5

J'ai différentes bases de données, et ce que je suis sûr de supprimer quelque chose (une vue dans ce cas) qui est vraiment orphelin. Est-ce le SQL correct à l'aide:Trouver toutes les références à Voir

SELECT r.routine_name, 
     r.routine_definition 
    FROM INFORMATION_SCHEMA.ROUTINES r 
WHERE r.routine_definition LIKE '%my_view_name%' 

Le problème est que ces références ne sont pas ramassaient déclarations dans les procédures stockées, et je ne sais pas quoi d'autre.

J'ai trouvé le SO Question dont je me souvenais, mais ça n'aide pas non plus. Ceci:

SELECT t.* 
    FROM SYSCOMMENTS t 
WHERE CHARINDEX('my_view_name', t.text) > 0 

... est proche. Je reçois le corps de la procédure stockée que je sais utilise la vue, mais j'ai du mal à obtenir le nom de la procédure.

+0

Est-ce que "sp_depends" n'aide pas. Je suppose que vous devrez l'exécuter sur chaque base de données. – AntDC

Répondre

15

Vous avez une seule option.

select 
    object_name(m.object_id), m.* 
from 
    sys.sql_modules m 
where 
    m.definition like N'%my_view_name%' 

syscomments et INFORMATION_SCHEMA.routines ont des colonnes nvarchar (4000). Donc, si "myViewName" est utilisé à la position 3998, il ne sera pas trouvé. syscomments a plusieurs lignes mais ROUTINES tronque.

+0

assurez-vous de cocher toutes/toutes les bases de données ... – mmcrae

0

Votre méthode n'est pas entièrement correcte. Lisez cet article:

http://www.mssqltips.com/tip.asp?tip=1294

Votre méthode ne retournera aucun résultat si une autre vue utilise ce point de vue. SQL Server 2008 a une vue spéciale (sys.dm_sql_referencing_entities), ici, ce n'est pas si simple.

+0

Si vous souhaitez utiliser syscomments et obtenir le nom de l'objet. SELECT object_name (t.id), t * DE SYSCOMMENTS t OÙ CHARINDEX ('V_MIEJSCE', t.text)> 0 – LukLed

+0

@LukLed: Je n » Je voulais juste savoir ce qu'il y avait de mieux à utiliser. La réponse de gbn ne l'est pas. –

0

Je ne sais pas, mais je suppose que vous pouvez utiliser quelque chose comme cela si votre vue est utilisé dans une procédure stockée

SELECT * 
FROM syscomments c 
INNER JOIN sysobjects o ON c.id =o.id 
WHERE text LIKE '%my_view_name%' AND xtype ='p' 
+0

ne fonctionne pas pour le code long ... – gbn

+0

@gbn: Long code signifie longue procédure stockée ??? – Nirlep

+2

@Neil: La colonne de texte est tronquée au 1er 4 000 caractères, donc si la chaîne que vous cherchez n'est pas entièrement dans cette limite de 4 000 caractères, le SQL retournera un faux négatif. –

Questions connexes