2011-09-01 14 views
73

Stworzyłem tabelę w środowisku programistycznym do celów testowych i istnieje kilka sp, które są refowanie tej tabeli. Teraz muszę upuścić tę tabelę, a także zidentyfikować wszystkie sp, które odnoszą się do tej tabeli. Mam trudności ze znalezieniem listy wszystkich SP. Proszę zaproponować jakieś zapytanie, zakładając, że nazwa tabeli jest „x”, a baza danych jest SQL Server 2005.Jak zidentyfikować wszystkie procedury przechowywane odnoszące się do konkretnej tabeli

+0

możliwy duplikat [SQL Server 2005 - Znajdź, które zapisane procesy przebiegają do konkretnej tabeli] (http://stackoverflow.com/questions/3361141/sql-server-2005-find-which-stored-procs-run- do-a-specific-table) –

+0

możliwy duplikat [jak wyszukiwać Sql Server 2008 R2 procedur przechowywanych na ciąg znaków?] (http://stackoverflow.com/questions/6354256/how-to-search-sql-server- 2008-r2-stored-procedures-for-a-string) lub http://stackoverflow.com/questions/3991030/searching-in-sql-management-studio-2005/3991077#3991077 – gbn

+0

do ekspertów: jak o serwer inny niż MS SQL? – Deian

Odpowiedz

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

BTW - tutaj jest poręcznym źródłem dla tego typu pytania: http://msdn.microsoft.com/en-us/library/ms345522%28v=SQL.90%29.aspx

+1

Czy jest jakikolwiek powód, aby to zrobić, uzyskując dostęp do 'ROUTINE_DEFINITION 'na' INFORMATION_SCHEMA.ROUTINES'? – Marie

+0

@Marie - SQL Server 2005 (AFAIK) nie ma tego. – Chains

+0

Pytanie, czy to rozwiązanie znajduje obiekty odniesienia, do których się odwołują * wewnątrz * ciągu znaków? jak, 'set @Query =" SELECT * FROM Object_I_Need_To_Find_References ... "; ' –

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

Wystarczy pamiętać, że będzie to również włączyć się nastawy SP gdzie nazwa tabeli jest w komentarzach lub w których 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 próbujesz wyszukać SP z "testem", otrzymasz wyniki dla obu.

+1

Wypisywanie 'syscomments' w ten sposób nie jest niezawodne w przypadku długich procedur, ponieważ dzieli definicję na 4000 znaków w wielu wierszach. 'sys.sql_modules' unika tego. –

+0

Dobra uwaga. Zaktualizowałem go, aby używał 'sys.sql_modules'. –

+2

syscomments został zdemaskowany w każdej z kilkunastu odpowiedzi na to samo pytanie http://stackoverflow.com/search?tab=votes&q=user%3a27535%20syscomments – gbn

13

Sposób non-query byłoby użyć SQL Server Management Studio.

Znajdź tabelę, kliknij prawym przyciskiem myszy i wybierz "Wyświetl zależności".

EDIT

Ale, jak komentujących powiedział, że nie jest bardzo niezawodny.

+3

W 2005 r. Informacje o zależnościach są niewiarygodne, jeśli obiekty nie zostały utworzone we właściwej kolejności. –

+1

Jak zauważyła @Martin Smith, utworzona zostanie procedura składowana odwołująca się do nieistniejącego obiektu, aczkolwiek z ostrzeżeniem, ale wpis nie zostanie umieszczony w sysdepends. To samo dotyczy procedur przechowywanych odwołujących się do tabeli w zagranicznej bazie danych: Żadna pozycja nie jest nigdy umieszczana w bazie danych sysdepends. Funkcja Antoher polega na tym, że upuszczenie/ponowne utworzenie tabeli lub widoku powoduje przerwanie łańcucha zależności. Te ... err ... funkcje powodują, że śledzenie zależności SQL Server jest praktycznie bezużyteczne. –

18

Następujące prace na SQL2008 i wyżej. Zawiera listę zarówno przechowywanych procedur 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 
+0

OP potrzebuje odpowiedzi dla SQL-Server-2005 – Chains

4

Następująca kwerenda pobiera wszystkie zapisane nazwy procedury i odpowiednią definicję tych SP na

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

czasami powyżej zapytań nie da poprawny wynik, nie jest zbudowany w procedurze przechowywanej dostępnych dostać stolik zależności jak:

EXEC sp_depends @objname = N'TableName'; 
+0

Nie działa z Sql Azure –

+0

Dla mnie to pokazało wyzwalacze i widoki, ale nie przechowywane procs. – NealWalters

+0

UWAGA: Uruchomiłem to w systemie, w którym miałem dostęp do tabel, ale nie przechowywano Proc, więc oczywiście Zapisane Proc nie pojawiły się w wyniku. – NealWalters

4

poniżej kwerendy jest praca tylko na stole nie dla kolumny

EXEC sp_depends @objname = N'TableName'; 

poniżej zapytania najlepiej jest to nie przegap niczego nie daje dodatkowych ale nie źle

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

Dla mnie, nie zwróciło nic na SSMS 2014 uruchomiony przeciwko bazy danych na SQL Server 12.0) – NealWalters

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

GO 

To będzie działać, jeśli trzeba wymienić nazwę tabeli.

Powiązane problemy