2008-09-23 4 views
7

Ho un enorme database con centinaia di tabelle e stored procedure. Utilizzando SQL Server 2005, come è possibile ottenere un elenco di stored procedure che eseguono un'operazione di inserimento o aggiornamento su una determinata tabella.Elenco di stored procedure dalla tabella

risposta

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

Questo vi darà un elenco di tutti i contenuti stored procedure con INSERT o UPDATE in loro per una particolare tabella (ovviamente è possibile modificare la query per soddisfare). Anche le procedure più lunghe verranno suddivise su più righe nel recordset restituito, quindi potrebbe essere necessario eseguire un po 'di setacciatura manuale attraverso i risultati.

Modifica: query ottimizzata per restituire anche il nome SP. Inoltre, si noti che la query precedente restituirà eventuali UDF e SP.

+0

questo mi sta dando l'ID SP ... posso raggiungere il nome SP con questo ID? – Vinodtiru

+0

Sì, ho ottimizzato la query per includerla. Vedo che ora sono state pubblicate un paio di altre risposte che ti faranno ottenere anche tu. –

+0

La mia risposta qui: http://stackoverflow.com/questions/119679/list-of-stored-procedure-from-table#119719 è quasi identica (restituisce il nome). Tuttavia, penso che Luke abbia ragione nel dire che non è necessario usare DISTINCT come nella mia risposta –

1

Si potrebbe provare a esportare tutte le stored procedure in un file di testo e quindi utilizzare una ricerca semplice.

Una tecnica più avanzata sarebbe quella di utilizzare una ricerca regexp per trovare tutte le voci SELECT FROM e 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 è stato usato come una risorsa per la ricerca SP.

2

Utilizzare sys.dm_sql_referencing_entities

Nota che sp_depends è obsoleto.

MSDN Reference

1

Questo sembra funzionare:

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 ha una lista di soggetti con dipendenze, incluse le tabelle e le colonne che uno sProc include nelle query. Vedere this post per un esempio di una query che ottiene le dipendenze. Lo snippet di codice seguente otterrà un elenco di dipendenze tabella/colonna per stored procedure

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 [libreria MSDN] (http://msdn.microsoft.com/en-us/library/ms174402.aspx) dice che ora è deprecata e dovrebbe essere sostituita con sys.sql_expression_dependencies. Sfortunatamente non riesco a ottenere l'equivalente per funzionare. Nella query mostrata nella risposta d.object_id non esiste più. Ho provato d.referencing_id ma non ha funzionato. Qualche idea su come usare sql_expression_dependencies? – Drew

+1

Su 'sys.sql_expression_dependencies',' referencing_id' è l'elemento che fa riferimento alla destinazione e 'referenced_id' è la dipendenza. La tabella ha anche nomi di schema e di entità per le entità referenziate nella tabella. Gli ID minori si riferiscono ai numeri di colonna, con 0 che indica nessun particolare riferimento di colonna. – ConcernedOfTunbridgeWells

+0

Penso di avere tutto ciò che è giù. Penso che il problema sia che tutte le mie righe sql_expression_dependencies hanno uno 0 per referenced_minor_id. La query analoga di sql_dependencies ha restituito molte righe diverse da zero e sono sorpreso che i risultati siano tanto diversi quanto lo sono. Sembra che rende sql_expression_dependencies molto meno utile perché spesso voglio vedere quali sproc fanno riferimento a una colonna specifica. Per riferimento, ho eseguito un conteggio di selezione (*) da entrambi dove referenced_minor_id <> 0. Sono presenti 38119 di tali righe in sql_dependencies e 112 in sql_expression_dependencies. – Drew