Suchen Sie die gespeicherte Prozedur nach Namen

83

Gibt es eine Möglichkeit, die gespeicherte Prozedur in SQL Server Management Studio nach Namen oder nach Teilen des Namens zu finden? (im aktiven Datenbankkontext)

Danke für die Hilfe

Gruber
quelle

Antworten:

141

Sie können verwenden:

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

Wenn Sie den Code benötigen, können Sie in der Tabelle syscomments nachsehen

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

Update bearbeiten:

Sie können auch die ansi-Standardversion verwenden

SELECT * 
FROM 
    INFORMATION_SCHEMA.ROUTINES 
WHERE 
    ROUTINE_NAME LIKE '%name_of_proc%'
Preet Sangha
quelle
1
Wenn Sie Text des SP mit Namen erhalten möchten, ist es einfacher mit "sp_helptext SPNAME"
Harry Sarshogh
2
SQL 2012, musste inner join sys.procedures p on p.object_id = c.idstattdessen tun
user5226582
1
Hinweis für SQL Server: Die ANSI-Standardversion schneidet die ROUTINE_DEFINITION bei 8 KB ab. Sie können object_definition(object_id(r.ROUTINE_NAME)),alternativ das Problem verwenden.
Mark Schultheiss
+1 für die ANSI-Standardversion, die Katalog (Datenbank) und Schema zurückgibt, falls Sie nicht sicher sind, wo sich die Prozedur befindet. (Ich habe beispielsweise einen Agent-Job gefunden, der auf eine Prozedur verweist, die ich nicht leicht finden konnte. Die ANSI-Standardabfrage hat dies für mich gelöst.)
youcantryreachingme
42

Angenommen, Sie befinden sich im Objekt-Explorer Details ( F7), in dem die Liste der gespeicherten Prozeduren angezeigt wird, klicken Sie auf die Schaltfläche Filter und geben Sie den Namen (oder den Teilnamen) ein.

Alt-Text

Codesleuth
quelle
2
Vielen Dank, ich wusste nichts über die Filtersache, irgendwie habe ich diesen Knopf nie gesehen.
Chad Portman
5

Dies funktioniert (unter anderem) auch für Tabellen und Ansichten, nicht nur für Sprocs:

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

Außerdem erhalten Sie den Schemanamen, der in jeder nicht trivialen Datenbank nützlich ist (z. B. in einer Datenbank, in der Sie eine Abfrage benötigen, um eine gespeicherte Prozedur nach Namen zu finden).

nathanchere
quelle
1
Beim Migrieren einer Legacy-App von SQL 2005 auf 2016 wurde in meinem Skript die falsche Syntax in der Nähe von @errorMessage angezeigt, was nicht besonders hilfreich war. Wenn ich dieselbe SQL in SSSM ausgeführt habe, wurde "in procedure 'some_name'" hinzugefügt, aber es gab nirgendwo eine solche gespeicherte Prozedur! Es stellte sich heraus, dass es ein Auslöser war, und Ihre Anfrage hat ihn gefunden. Vielen Dank!
MickeyfAgain_BeforeExitOfSO
1

Sie können diese Abfrage verwenden:

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

Wie Sie sehen können, können Sie auch im Hauptteil der gespeicherten Prozedur suchen.

Ardalan Shahgholi
quelle
0

Sehr ordentlicher Trick Ich stolpere über eine SQL-Injection. Verwenden Sie im Objekt-Explorer im Suchfeld nur Ihre Prozentzeichen. Dadurch werden ALLE gespeicherten Prozeduren, Funktionen, Ansichten, Tabellen, Schemata, Indizes durchsucht. Ich habe es satt, an mehr zu denken :) :)

Suchmuster

Ernest Gunning
quelle
0

Wenn ich einen Store Procedure-Namen habe und nicht weiß, zu welcher Datenbank er gehört, verwende ich Folgendes:

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
quelle
0

Für SQL Server Version 9.0 (2005) können Sie den folgenden Code verwenden:

select * 
from 
syscomments c
inner join sys.procedures p on p.object_id = c.id
where 
p.name like '%usp_ConnectionsCount%';
Sergey Nasonov
quelle
0

Option 1: Gehen Sie in SSMS zu View > Object Explorer Detailsoder drücken Sie F7. Verwenden Sie die SearchBox. Klicken Sie schließlich in der angezeigten Liste mit der rechten Maustaste und wählen Sie Synchronize, um das Objekt im Object ExplorerBaum zu finden.

Details zum Objekt-Explorer

Option 2: Installieren Sie ein Add-On wie dbForge Search. Klicken Sie mit der rechten Maustaste auf die angezeigte Liste und wählen Sie Find in Object Explorer.

Geben Sie hier die Bildbeschreibung ein

Luis Hernandez
quelle