Como identificar todos os procedimentos armazenados referentes a uma tabela específica

136

Eu criei uma tabela no ambiente de desenvolvimento para fins de teste e existem alguns sps que estão refreing esta tabela. Agora eu tenho que descartar esta tabela e identificar todos os sps que estão se referindo a esta tabela. Estou enfrentando dificuldades para encontrar a lista de todos os sps. Por favor, sugira alguma consulta assumindo que o nome da tabela seja 'x' e o banco de dados seja sql server 2005.

DJay
fonte
1
para os especialistas: que tal para um servidor não-MS SQL?
Deian 04/09/2015

Respostas:

259
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

Entre - aqui está um recurso útil para esse tipo de pergunta: Consultando as Perguntas frequentes sobre o catálogo de sistemas do SQL Server

Correntes
fonte
3
Existe alguma razão para fazer isso acessando o ROUTINE_DEFINITIONon INFORMATION_SCHEMA.ROUTINES?
23716 Marie
1
@ Marie - SQL-Server 2005 (AFAIK) não tem isso.
Cadeias
2
Pergunta, esta solução encontra objetos referenciados quando são referenciados dentro de uma string? Veja tambémset @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark #
1
@ Jeff.Clark - Existe uma maneira fácil de descobrir :-) - mas sim, ele pesquisa diretamente o texto do procedimento, para descobrir isso.
Cadeias
2
sim sim :) Ele ia me levar um tempo para configurar o teste, e eu estava apenas procurando uma resposta preguiçoso / fácil :)
Jeff.Clark
27

O seguinte funciona no SQL2008 e acima. Fornece uma lista de procedimentos e funções armazenados.

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name
Guy Hollington
fonte
1
O OP precisa da resposta para SQL-Server-2005
Cadeias
19

às vezes, as consultas acima não dão o resultado correto, existe um procedimento armazenado interno disponível para obter as dependências da tabela como:

EXEC sp_depends @objname = N'TableName';
Pramod Pawar
fonte
1
Para mim, isso mostrou gatilhos e visualizações, mas não procs armazenados.
NealWalters
1
NOTA: Eu executei isso em um sistema em que eu tinha acesso a tabelas, mas não aos Procs armazenados, portanto, é claro que os Procs armazenados não apareceram no resultado.
NealWalters
18

Uma maneira sem consulta seria usar o Sql Server Management Studio.

Localize a tabela, clique com o botão direito e escolha "Exibir dependências".

EDITAR

Mas, como disseram os comentaristas, não é muito confiável.

Hans Keing
fonte
4
Em 2005, as informações de dependências não são confiáveis ​​se os objetos não forem criados na ordem correta.
Martin Smith
3
Como @Martin Smith observou, um procedimento armazenado referenciando um objeto inexistente será criado, embora com um aviso, mas nenhuma entrada será colocada em sysdepends. Além disso, o mesmo vale para procedimentos armazenados que referenciam uma tabela em um banco de dados externo: Nenhuma entrada é colocada em sysdepends em nenhum banco de dados. Outro recurso é que ao largar / recriar uma tabela ou exibição, a cadeia de dependência é interrompida. Esses recursos ... err ... tornam o rastreamento de dependência do SQL Server praticamente inútil.
Nicholas Carey
7

A consulta a seguir buscará todos os nomes de procedimentos armazenados e a definição correspondente desses SPs

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'
Deepak Kothari
fonte
5
SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

Lembre-se de que isso também aumentará os SPs nos quais o nome da tabela está nos comentários ou em que o nome da tabela é uma substring de outro nome da tabela que está sendo usado. Por exemplo, se você tiver tabelas nomeadas "test" e "test_2" e tentar procurar SPs com "test", obterá resultados para ambos.

Tom H
fonte
2
A consulta syscommentsdessa maneira não é confiável para procedimentos longos, pois divide a definição em pedaços de 4000 caracteres em várias linhas. sys.sql_modulesevita isso.
Martin Smith
1
Bom ponto. Eu atualizei para usar em seu sys.sql_moduleslugar.
Tom H
3
syscomments foi desmascarado em cada um dos meus dúzia de respostas para a mesma pergunta stackoverflow.com/...
GBN
5

A consulta abaixo funciona apenas ao procurar dependências em uma tabela e não em uma coluna:

EXEC sp_depends @objname = N'TableName';

No entanto, a consulta a seguir é a melhor opção, se você deseja procurar todos os tipos de dependências, ela não perde nada. Na verdade, fornece mais informações do que o necessário.

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name
Siraj Ansari
fonte
1
Para mim, não retornou nada no SSMS 2014 correndo contra banco de dados em SQL Server 12.0)
NealWalters
3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

Isso funcionará se você precisar mencionar o nome da tabela.

ric
fonte
3

No estúdio de gerenciamento, você pode clicar com o botão direito do mouse na tabela e clicar em 'Exibir dependências' insira a descrição da imagem aqui

do que você pode ver uma lista de objetos que possuem dependências com sua tabela:insira a descrição da imagem aqui

nzrytmn
fonte
1

Você tem basicamente 2 opções:

----Opção 1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

----Opção 2

SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

Essas 2 consultas fornecerão todos os procedimentos armazenados que se referem à tabela que você deseja. Esta consulta baseia-se em 2 tabelas sys que são sysobjects e syscomments. O sysobjects é onde todos os nomes de objetos do banco de dados são armazenados, incluindo os procedimentos armazenados.

Os syscomments contêm o texto para todos os seus procedimentos.

Se você consultar: SELECT * FROM syscomments

Você terá uma tabela contendo o ID, que é o mapeamento para a tabela sysobjects, com o texto contido nos procedimentos armazenados como a última coluna.

Alain Ghawi
fonte
0

Experimente isto

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
Pooja Chavan
fonte