Jak zidentyfikować wszystkie procedury składowane odwołujące się do określonej tabeli


140

Stworzyłem tabelę na temat środowiska programistycznego do celów testowych i jest kilka programów, które odświeżają tę tabelę. Teraz muszę usunąć tę tabelę, a także zidentyfikować wszystkie sp, które odwołują się do tej tabeli. Mam trudności ze znalezieniem listy wszystkich sp. Proszę zasugerować zapytanie, zakładając, że nazwa tabeli to „x”, a baza danych to sql server 2005.




1
do ekspertów: co powiesz na serwer inny niż MS SQL?
Deian

Odpowiedzi:


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

BTW - tutaj jest przydatny zasób dla tego typu pytań: Zapytanie do SQL Server System Catalog FAQ


3
Czy jest jakiś powód, aby to zrobić w ciągu uzyskiwania dostępu do ROUTINE_DEFINITIONna INFORMATION_SCHEMA.ROUTINES?
Marie

1
@Marie - SQL-Server 2005 (AFAIK) tego nie ma.
Łańcuchy

2
Pytanie, czy to rozwiązanie znajduje obiekty, do których istnieją odniesienia, gdy są one przywoływane w ciągu? jak,set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark,

1
@ Jeff.Clark - Jest łatwy sposób, aby się tego dowiedzieć :-) - ale tak, przeszukuje tekst procedury bezpośrednio, więc znalazłby to.
Łańcuchy

2
Tak, tak :) Przygotowanie testu zajęło mi trochę czasu, a ja szukałem leniwej / łatwej odpowiedzi :)
Jeff.Clark

29

Poniższe informacje działają na SQL2008 i nowszych wersjach. Zawiera listę zarówno procedur składowanych, jak i funkcji.

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

2
OP potrzebuje odpowiedzi dla SQL-Server-2005
Chains,

Z jakiegoś powodu to nie działa dla mnie. Zwraca 0 wierszy.
szafa grająca

21

czasami powyższe zapytania nie dadzą poprawnego wyniku, dostępna jest wbudowana procedura składowana do pobrania zależności tabeli, jak:

EXEC sp_depends @objname = N'TableName';

1
Dla mnie pokazało to wyzwalacze i widoki, ale nie zapisane procesy.
NealWalters

1
UWAGA: Uruchomiłem to w systemie, w którym miałem dostęp do tabel, ale nie do przechowywanych procesów, więc oczywiście przechowywane procesy nie pojawiły się w wyniku.
NealWalters

20

Sposobem innym niż zapytania byłoby użycie Sql Server Management Studio.

Zlokalizuj tabelę, kliknij prawym przyciskiem myszy i wybierz „Wyświetl zależności”.

EDYTOWAĆ

Ale, jak powiedzieli komentatorzy, nie jest to zbyt wiarygodne.


4
W 2005 r. Informacje o zależnościach są niewiarygodne, jeśli obiekty nie są tworzone we właściwej kolejności.
Martin Smith

3
Jak zauważył @Martin Smith, procedura składowana odwołująca się do nieistniejącego obiektu zostanie utworzona, choć z ostrzeżeniem, ale żaden wpis nie zostanie umieszczony w sysdepends. To samo dotyczy procedur składowanych odwołujących się do tabeli w obcej bazie danych: żaden wpis nie jest nigdy umieszczany w sysdepends w żadnej z baz danych. Inna funkcja polega na tym, że upuszczenie / ponowne utworzenie tabeli lub widoku przerywa łańcuch zależności. Te ... błądzenie ... funkcje sprawiają, że śledzenie zależności SQL Server jest praktycznie bezużyteczne.
Nicholas Carey

7

Następujące zapytanie pobierze wszystkie nazwy procedur składowanych i odpowiadające im definicje tych SP

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'

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

Należy tylko pamiętać, że spowoduje to również wyświetlenie SP tam, gdzie nazwa tabeli znajduje się w komentarzach lub gdy nazwa tabeli jest podłańcuchem innej używanej nazwy tabeli. Na przykład, jeśli masz tabele o nazwach „test” i „test_2” i spróbujesz wyszukać SP za pomocą „test”, otrzymasz wyniki dla obu.


2
Wykonywanie zapytań syscommentsw ten sposób nie jest niezawodne w przypadku długich procedur, ponieważ dzieli definicję na fragmenty 4000 znaków w wielu wierszach. sys.sql_modulesunika tego.
Martin Smith

1
Słuszna uwaga. Zaktualizowałem go, aby używać sys.sql_moduleszamiast tego.
Tom H

3
syscomments został zdemaskowany w każdej z moich kilkunastu odpowiedzi na to samo pytanie stackoverflow.com/…
gbn

5

Poniższe zapytanie działa tylko podczas wyszukiwania zależności w tabeli, a nie w kolumnie:

EXEC sp_depends @objname = N'TableName';

Jednak poniższe zapytanie jest najlepszą opcją, jeśli chcesz szukać wszelkiego rodzaju zależności, nie pomija niczego. W rzeczywistości dostarcza więcej informacji niż jest to wymagane.

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name

1
Dla mnie nie
zwróciłem

5

W studiu zarządzania możesz po prostu kliknąć prawym przyciskiem myszy tabelę i kliknąć `` Wyświetl zależności '' wprowadź opis obrazu tutaj

niż możesz zobaczyć listę obiektów, które mają zależności z twoją tabelą:wprowadź opis obrazu tutaj


3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

To zadziała, jeśli będziesz musiał podać nazwę tabeli.


1

Masz zasadniczo 2 opcje:

----Opcja 1

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

----Opcja 2

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

Te 2 zapytania pozwolą uzyskać wszystkie procedury składowane, które odnoszą się do żądanej tabeli. To zapytanie opiera się na 2 tabelach sys, które są obiektami sysobject i syscomments. W sysobjects są przechowywane wszystkie nazwy obiektów DB, w tym procedury składowane.

Komentarze syscomments zawierają tekst wszystkich twoich procedur.

Jeśli zapytasz : SELECT * FROM syscomments

Będziesz mieć tabelę zawierającą identyfikator, który jest mapowaniem do tabeli sysobjects z tekstem zawartym w procedurach składowanych jako ostatnią kolumnę.


0

Spróbuj tego

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.