Znajdź procedurę składowaną według nazwy

84

Czy istnieje sposób, aby znaleźć procedurę składowaną w SQL Server Management Studio według nazwy lub części nazwy? (w kontekście aktywnej bazy danych)

Dzięki za pomoc

gruber
źródło

Odpowiedzi:

142

Możesz użyć:

select * 
from 
   sys.procedures 
where 
   name like '%name_of_proc%'

jeśli potrzebujesz kodu, możesz zajrzeć do tabeli syscomments

select text 
from 
    syscomments c
    inner join sys.procedures p on p.object_id = c.object_id
where 
    p.name like '%name_of_proc%'

Edytuj aktualizację:

można również użyć standardowej wersji ansi

SELECT * 
FROM 
    INFORMATION_SCHEMA.ROUTINES 
WHERE 
    ROUTINE_NAME LIKE '%name_of_proc%'
Preet Sangha
źródło
1
Jeśli chcesz otrzymać tekst sp z nazwą, łatwiej jest użyć "sp_helptext SPNAME"
Harry Sarshogh
2
Sql 2012, musiał zrobić inner join sys.procedures p on p.object_id = c.idzamiast tego
user5226582
1
Uwaga dla SQL Server standardowa wersja ANSI odcina ROUTINE_DEFINITION przy 8k. Możesz użyć object_definition(object_id(r.ROUTINE_NAME)),jako alternatywy to jest problem.
Mark Schultheiss
+1 dla standardowej wersji ANSI, która zwraca katalog (bazę danych) i schemat w przypadku, gdy nie jesteś pewien, gdzie znajduje się procedura. (Na przykład znalazłem zadanie agenta odnoszące się do procedury, której nie mogłem łatwo zlokalizować; standardowe zapytanie ANSI rozwiązało to za mnie).
youcantryreachingme
42

Zakładając, że znajdujesz się w Detale eksploratora obiektów ( F7) pokazującym listę procedur składowanych, kliknij przycisk Filtry i wprowadź nazwę (lub nazwę częściową).

tekst alternatywny

Codesleuth
źródło
2
Dziękuję bardzo, że nie wiedziałem o tej rzeczy z filtrem, jakoś nigdy nie widziałem tego przycisku.
Chad Portman
5

Będzie to działać również dla tabel i widoków (między innymi), a nie tylko dla sproców:

SELECT
    '[' + s.name + '].[' + o.Name + ']',
    o.type_desc
FROM
    sys.objects o
    JOIN sys.schemas s ON s.schema_id = o.schema_id
WHERE
    o.name = 'CreateAllTheThings' -- if you are certain of the exact name
    OR o.name LIKE '%CreateAllThe%' -- if you are not so certain

Podaje również nazwę schematu, która będzie przydatna w każdej nietrywialnej bazie danych (np. Takiej, w której potrzebujesz zapytania, aby znaleźć procedurę składowaną według nazwy).

nathanchere
źródło
1
Migracja starszej aplikacji z sql 2005 do 2016 mój skrypt otrzymał „niepoprawną składnię w pobliżu„ @errorMessage ”, co nie było zbyt pomocne. Kiedy uruchomiłem ten sam sql w SSSM, dodałem „w procedurze 'jakaś_nazwa'”, ale nigdzie nie było takiej procedury składowanej! Okazało się, że to wyzwalacz, a Twoje zapytanie go znalazło. Dzięki!
MickeyfAgain_BeforeExitOfSO
1

Możesz użyć tego zapytania:

SELECT 
    ROUTINE_CATALOG AS DatabaseName ,
    ROUTINE_SCHEMA AS SchemaName,
    SPECIFIC_NAME AS SPName ,
    ROUTINE_DEFINITION AS SPBody ,
    CREATED AS CreatedDate,
    LAST_ALTERED AS LastModificationDate
FROM INFORMATION_SCHEMA.ROUTINES
WHERE 
    (ROUTINE_DEFINITION LIKE '%%')
    AND 
    (ROUTINE_TYPE='PROCEDURE')
    AND
    (SPECIFIC_NAME LIKE '%AssessmentToolDegreeDel')

Jak widać, możesz również przeszukiwać treść procedury składowanej.

Ardalan Shahgholi
źródło
0

Bardzo fajna sztuczka, na którą natknąłem się, próbując wstrzyknąć SQL, w eksploratorze obiektów w polu wyszukiwania po prostu użyj swoich znaków procentowych, a to przeszuka WSZYSTKO procedury składowane, funkcje, widoki, tabele, schematy, indeksy ... Mam dość myślenia o więcej :)

Wzorzec wyszukiwania

Ernest Gunning
źródło
0

Kiedy mam nazwę procedury sklepu i nie wiem, do której bazy danych ona należy, używam następującego -

Use [master]
GO

DECLARE @dbname VARCHAR(50)   
DECLARE @statement NVARCHAR(max)

DECLARE db_cursor CURSOR 
LOCAL FAST_FORWARD
FOR  
--Status 48 (mirrored db)
SELECT name FROM MASTER.dbo.sysdatabases WHERE STATUS NOT LIKE 48 AND name NOT IN ('master','model','msdb','tempdb','distribution')  

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @dbname  
WHILE @@FETCH_STATUS = 0  
BEGIN  

SELECT @statement = 'SELECT * FROM ['+@dbname+'].INFORMATION_SCHEMA.ROUTINES  WHERE [ROUTINE_NAME] LIKE ''%name_of_proc%'''+';'
print @statement

EXEC sp_executesql @statement

FETCH NEXT FROM db_cursor INTO @dbname  
END  
CLOSE db_cursor  
DEALLOCATE db_cursor
Radagast_Brown
źródło
0

W przypadku programu SQL Server w wersji 9.0 (2005) można użyć poniższego kodu:

select * 
from 
syscomments c
inner join sys.procedures p on p.object_id = c.id
where 
p.name like '%usp_ConnectionsCount%';
Sergey Nasonov
źródło
0

Opcja 1: W SSMS przejdź do View > Object Explorer Detailslub naciśnij F7. Użyj Searchpudełka. Na koniec na wyświetlonej liście kliknij prawym przyciskiem myszy i wybierz, Synchronizeaby znaleźć obiekt w Object Explorerdrzewie.

Szczegóły eksploratora obiektów

Opcja 2: Zainstaluj dodatek podobny do dbForge Search. Kliknij prawym przyciskiem myszy wyświetloną listę i wybierz Find in Object Explorer.

wprowadź opis obrazu tutaj

Luis Hernandez
źródło