2009-10-01 16 views
5

Ich habe verschiedene Datenbanken, und was sicher sein wird, dass ich etwas entferne (eine Ansicht in diesem Fall), das wirklich verwaist ist. Ist das die richtige SQL zu verwenden:Alle Referenzen zur Ansicht finden

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

Das Problem damit ist, dass diese Referenzen sind Abholung keine Deklarationen in gespeicherten Prozeduren und ich weiß nicht, was sonst noch.

Ich fand die SO Question Ich erinnerte mich, aber es hilft auch nicht. Dies ist:

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

... ist in der Nähe. Ich bekomme den Körper der gespeicherten Prozedur, von der ich weiß, dass sie die Ansicht verwendet, aber ich habe Schwierigkeiten, den Namen der tatsächlichen Prozedur zu erhalten.

+0

Hilft "sp_depends" nicht. Ich nehme an, Sie müssten es auf jeder Datenbank ausführen. – AntDC

Antwort

15

Sie haben nur eine Option.

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

syscomments und INFORMATION_SCHEMA.routinen haben nvarchar (4000) Spalten. Wenn also "myViewName" an Position 3998 verwendet wird, wird es nicht gefunden. syscomments hat mehrere Zeilen, aber ROUTINES schneidet ab.

+0

stellen Sie sicher, dass Sie auch alle/alle Datenbanken überprüfen ... – mmcrae

0

Ihre Methode ist nicht vollständig korrekt. Lesen Sie diesen Artikel:

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

Ihre Methode wird kein Ergebnis zurück, wenn eine andere Ansicht dieser Ansicht verwendet.

SQL Server 2008 hat spezielle Ansicht (sys.dm_sql_referencing_entities), hier ist es nicht so einfach.

+0

Wenn Sie syscomments verwenden und Objektnamen zu erhalten. SELECT object_name (t.id), t * VON SYSCOMMENTS t WHERE CHARINDEX ('V_MIEJSCE', t.text)> 0 – LukLed

+0

@LukLed: Ich didn‘ Ich möchte nur wissen, was am besten ist. Per gbn's Antwort ist es nicht. –

0

Ich bin nicht sicher, aber ich denke, Sie so etwas wie dies, wenn Ihre Ansicht in einigen gespeicherten Prozedur verwendet wird, können

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

funktioniert nicht für langen Code ... – gbn

+0

@gbn: Langer Code bedeutet lange gespeicherte Prozedur ??? – Nirlep

+2

@Neil: Die Textspalte wird auf die ersten 4.000 Zeichen gekürzt. Wenn die gesuchte Zeichenfolge nicht vollständig innerhalb dieser 4.000 Zeichen Grenze liegt, gibt die SQL-Anweisung ein falsches Negativ zurück. –

Verwandte Themen