Elenco delle procedure memorizzate dalla tabella
-
02-07-2019 - |
Domanda
Ho un enorme database con centinaia di tabelle e procedure memorizzate. Utilizzando SQL Server 2005, come posso ottenere un elenco di procedure memorizzate che eseguono un'operazione di inserimento o aggiornamento su una determinata tabella.
Soluzione
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 ti darà un elenco di tutti i contenuti delle procedure memorizzate con INSERT o UPDATE in esse per una particolare tabella (puoi ovviamente modificare la query per adattarla). Inoltre, le procedure più lunghe verranno suddivise su più righe nel recordset restituito, pertanto potrebbe essere necessario eseguire un po 'di setacciamento manuale dei risultati.
Modifica : query ottimizzata per restituire anche il nome SP. Inoltre, tieni presente che la query precedente restituirà qualsiasi UDF e SP.
Altri suggerimenti
sys.sql_dependencies
ha un elenco di entità con dipendenze, incluse tabelle e colonne che uno sproc include nelle query. Vedi questo post per un esempio di una query che ottiene dipendenze. Lo snippet di codice seguente otterrà un elenco di dipendenze di tabella / colonna in base alla procedura memorizzata
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'
Potresti provare a esportare tutte le procedure memorizzate 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.
Questo sembra funzionare:
selezionare
so.name come [proc],
so2.name come [tabella],
sd.is_updated
da sysobjects così
join interno sys.sql_dependencies sd on so.id = sd.object_id
join interno sysobjects so2 su sd.referenced_major_id = so2.id
dove so.xtype = 'p' - procedura
e is_updated = 1 - tabella degli aggiornamenti proc, o almeno, penso che questo significhi
Se scarichi sp_search_code dal sito Web di Vyaskn ti consentirà di trovare qualsiasi testo all'interno degli oggetti del tuo database.
http://vyaskn.tripod.com/sql_server_search_stored_procedure_code.htm
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
Questo link è stato utilizzato come risorsa per la ricerca SP.