Pergunta

Eu tenho um enorme banco de dados com 100 dos tabelas e procedimentos armazenados. Usando o SQL Server 2005, como posso obter uma lista de procedimentos armazenados que estão fazendo uma inserção ou operação de atualização em uma determinada tabela.

Foi útil?

Solução

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

Isto lhe dará uma lista de todos os conteúdos procedimento armazenado com INSERT ou UPDATE em-los para uma determinada tabela (você pode, obviamente, ajustar a consulta para naipe). Também procedimentos mais longos será quebrado em várias linhas no conjunto de registros retornado para que você pode precisar de fazer um pouco de peneiração manual do através dos resultados.

Editar : Tweaked consulta para citar retorno SP também. Além disso, observe a consulta acima retornará quaisquer UDFs, bem como SPs.

Outras dicas

sys.sql_dependencies tem uma lista de entidades com as dependências, incluindo tabelas e colunas que um sproc inclui em consultas. Consulte este post para um exemplo de uma consulta que sai dependências. O trecho de código abaixo vai ter uma lista de dependências de tabela / coluna pelo procedimento armazenado

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'

Use sys.dm_sql_referencing_entities

Note que sp_depends está obsoleta.

MSDN Referência

Você poderia tentar exportar todos os seus procedimentos armazenados em um arquivo de texto e, em seguida, usar uma pesquisa simples.

A técnica mais avançada seria a utilização de uma pesquisa de expressão regular para encontrar tudo selecionar e inserir a partir entradas.

Isso parece funcionar:

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 você baixar sp_search_code do site da Vyaskn que lhe permitirá encontrar qualquer texto dentro de seus objetos de banco de dados.

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

Este link foi usada como um recurso para a busca SP.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top