2009-10-01 40 views
5

Tengo varias bases de datos y estoy seguro de que estoy eliminando algo (una vista en este caso) que está realmente huérfano. Es el SQL correcto a utilizar:Buscar todas las referencias para ver

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

El problema con esto es que estas referencias no están recogiendo declaraciones en los procedimientos almacenados, y no sé qué más.

Encontré el SO Question que recordaba, pero tampoco está ayudando. Este:

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

... está cerca. Obtengo el cuerpo del procedimiento almacenado que sé que está usando la vista, pero estoy teniendo problemas para obtener el nombre real del procedimiento.

+0

¿No es útil "sp_depends"? Supongo que tendrías que ejecutarlo en cada base de datos. – AntDC

Respuesta

15

Usted tiene sólo una opción.

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

syscomments y INFORMATION_SCHEMA.routines tienen columnas nvarchar (4000). Entonces, si se usa "myViewName" en la posición 3998, no se encontrará. syscomments tiene varias líneas, pero ROUTINES trunca.

+0

asegúrate también de verificar todas las bases de datos ... – mmcrae

0

Su método no es del todo correcto. Lee este artículo:

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

Su método no devolverá ningún resultado si otra vista utiliza este punto de vista.

SQL Server 2008 tiene vista especial (sys.dm_sql_referencing_entities), aquí no es tan fácil.

+0

Si desea utilizar syscomments y obtener el nombre del objeto:. object_name SELECT (t.id), t * t DE SYSCOMMENTS DONDE CHARINDEX ('V_MIEJSCE', t.text)> 0 – LukLed

+0

@LukLed: Yo no Quiero hacerlo, solo quería saber qué es lo mejor para usar. Por la respuesta de gbn, no lo es. –

0

no estoy seguro, pero supongo que se puede usar algo como esto si su vista se utiliza en algún procedimiento almacenado

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

no funciona para código largo ... – gbn

+0

@gbn: ¿código largo significa procedimiento almacenado largo ??? – Nirlep

+2

@Neil: la columna de texto se trunca en los primeros 4.000 caracteres, por lo que si la cadena que está buscando no está completamente dentro de ese límite de 4.000 caracteres, el SQL arrojará un falso negativo. –

Cuestiones relacionadas