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
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.
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.
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.
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
Se si scarica dal sito di sp_search_code Vyaskn vi permetterà di trovare qualsiasi testo all'interno di oggetti del database.
http://vyaskn.tripod.com/sql_server_search_stored_procedure_code.htm
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'
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
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
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
questo mi sta dando l'ID SP ... posso raggiungere il nome SP con questo ID? – Vinodtiru
Sì, ho ottimizzato la query per includerla. Vedo che ora sono state pubblicate un paio di altre risposte che ti faranno ottenere anche tu. –
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 –