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.

È stato utile?

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'

Usa sys.dm_sql_referencing_entities

Nota che sp_depends è obsoleto.

Riferimento MSDN

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top