2011-10-07 11 views
17

Sto esplorando un sistema di database legacy e ho una conoscenza minima del suo interno. Vorrei trovare tutte le stored procedure che richiamano un'altra stored procedure A.Interroga il contenuto delle stored procedure su SQL Server

Il modo migliore per farlo?

Posso scrivere qualcosa del genere pseudocodice:

select name from AllStoredProcedures as Asp where Asp.TextualContent contains 'A' 

Asp.TextualContent significa che lo SQL effettivo contenuto nella SP.

+0

Quale versione di SQL Server? –

+0

SQL Server 2005 – Ben

risposta

37
SELECT 
    OBJECT_NAME(OBJECT_ID), 
    definition 
FROM 
    sys.sql_modules 
WHERE 
    objectproperty(OBJECT_ID, 'IsProcedure') = 1 
AND definition LIKE '%Foo%' 
+0

Risposta eccezionale. Grazie – Ben

+0

mi ha salvato la vita! –

2

Questa query recupererà la definizione testuale di stored procedure e filtro utilizzando un semplice jolly.

Per il 2000 (non testato, ma IIRC è la tabella a destra):

select p.[type] 
     ,p.[name] 
     ,c.[text] 
    from sysobjects p 
    join syscomments c 
    on p.object_id = c.id 
where p.[type] = 'P' 
    and c.[text] like '%foo%' 

Per il 2005:

select p.[type] 
     ,p.[name] 
     ,c.[text] 
    from sys.objects p 
    join sys.syscomments c 
    on p.object_id = c.id 
where p.[type] = 'P' 
    and c.[text] like '%foo%' 

Per il 2005 e 2008+

select p.[type] 
     ,p.[name] 
     ,c.[definition] 
    from sys.objects p 
    join sys.sql_modules c 
    on p.object_id = c.object_id 
where p.[type] = 'P' 
    and c.[definition] like '%foo%' 
+1

'sys.syscomments' non dovrebbe essere usato per questo in quanto divide le definizioni lunghe in blocchi di 4.000 caratteri in modo da poter perdere le corrispondenze che attraversano i limiti del chunk. –

6

Per SQL Server 2005/2008:

SELECT s.name SchemaName 
     ,o.name RoutineName 
     ,o.[type] RoutineType 
     ,procs.* 
FROM sys.sql_modules procs 
INNER JOIN sys.objects o ON procs.object_id = o.object_id 
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id 
WHERE procs.[definition] LIKE '%A%' 
--AND  o.[type] = 'P' --'P' for stored procedures 
1

Try This una sola istruzione può risolvere il problema ..

SELECT OBJECT_DEFINITION(OBJECT_ID(N'dbo.myStoredProc')) 

o

SELECT @objname= OBJECT_DEFINITION(OBJECT_ID(N'dbo.myStoredProc')) 
print @objname 
Problemi correlati