Interrogazione per elencare tutte le procedure memorizzate


338

Quale query può restituire i nomi di tutte le procedure memorizzate in un database di SQL Server

Se la query potesse escludere le procedure memorizzate dal sistema, ciò sarebbe ancora più utile.

Risposte:


499

Come ha affermato Mike, il modo migliore è usare information_schema. Finché non ci si trova nel database principale, le procedure memorizzate dal sistema non verranno restituite.

SELECT * 
  FROM DatabaseName.INFORMATION_SCHEMA.ROUTINES
 WHERE ROUTINE_TYPE = 'PROCEDURE'

Se per qualche motivo nel database master fossero presenti procedure memorizzate non di sistema, è possibile utilizzare la query (ciò filtrerà la maggior parte delle procedure memorizzate di sistema):

SELECT * 
  FROM [master].INFORMATION_SCHEMA.ROUTINES
 WHERE ROUTINE_TYPE = 'PROCEDURE' 
   AND LEFT(ROUTINE_NAME, 3) NOT IN ('sp_', 'xp_', 'ms_')

3
Se crei diagrammi di database potresti ottenere un sacco di proc che iniziano con 'dt_' nel tuo database che puoi anche filtrare.
John Fouhy,

+1 per schema informativo. vale la pena di leggere: msdn.microsoft.com/en-us/library/ms186778.aspx
Shiham

Dovrebbe essere "Finché non sei nei database [master] o [msdb], ..."
Solomon Rutzky,

107
SELECT name, 
       type
  FROM dbo.sysobjects
 WHERE (type = 'P')

4
Questo ha funzionato per me in un ambiente condiviso in MS-SQL 2008; i due precedenti non ...
Realto619

3
Chiunque utilizzi SQL Server 2005 o versioni successive dovrebbe allontanarsi dalle dbo.sys*visualizzazioni. Questa query inoltre: filtra le stored procedure CLR, non filtra i proc memorizzati di sistema e restituisce [tipo] quando è noto che [tipo] sarà sempre 'P' poiché è la condizione WHERE.
Solomon Rutzky,

non funzionerà se gli oggetti nel database hanno schemi diversi
Foyzul Karim,

30

Dalla mia comprensione il metodo "preferito" è usare le tabelle information_schema:

select * 
  from information_schema.routines 
 where routine_type = 'PROCEDURE'

i record restituiti non sembrano avere un modo per differenziare le procedure memorizzate dal sistema

18

Di seguito verranno restituite tutte le procedure nel database selezionato

SELECT * FROM sys.procedures

questo è stato modificato e creato la data, ecc. che è molto utile
ihightower

14

Puoi provare questa query per ottenere stored procedure e funzioni:

SELECT name, type
FROM dbo.sysobjects
WHERE type IN (
    'P', -- stored procedures
    'FN', -- scalar functions 
    'IF', -- inline table-valued functions
    'TF' -- table-valued functions
)
ORDER BY type, name

10

Se si utilizza SQL Server 2005, funzionerà quanto segue:

select *
  from sys.procedures
 where is_ms_shipped = 0

questo darà il risultato sbagliato e includerà la procedura memorizzata come schema di sistema (sp_upgraddiagrams) in sql 2008
HaveNoDisplayName

@Piyush Vero che restituirà i proc del diagramma, ma qualcuno potrebbe non considerarli come proc "di sistema" poiché non sono venuti con l'installazione standard. L'OP non ha specificato come gestirlo, quindi non filtrarli non è necessariamente sbagliato.
Solomon Rutzky,

@srutzky: - ma questi non sono ancora sp creati dall'utente
HaveNoDisplayName

@Piyush Vero, ma come ho detto, l'OP non ha specificato come gestire i proc che non sono né "creati dall'utente" né "sistema". E nessuno ha chiesto.
Solomon Rutzky,

Bella risposta. Grazie per aver incluso "is_ms_shipped = 0."
Hans Vonn,

8

È possibile utilizzare una delle query seguenti per trovare l'elenco delle Stored procedure in un database:

Query1:

    SELECT 
        *
    FROM sys.procedures;

Query2:

    SELECT 
        * 
    FROM information_schema.routines 
    WHERE ROUTINE_TYPE = 'PROCEDURE' 

Se si desidera trovare l'elenco di tutti gli SP in tutti i database, è possibile utilizzare la query seguente:

    CREATE TABLE #ListOfSPs 
    (
        DBName varchar(100), 
        [OBJECT_ID] INT,
        SPName varchar(100)
    )

    EXEC sp_msforeachdb 'USE [?]; INSERT INTO #ListOfSPs Select ''?'', Object_Id, Name FROM sys.procedures'

    SELECT 
        * 
    FROM #ListOfSPs

1
IMO il tuo esempio usando sp_msforeachdb è oro e dovrebbe essere la risposta. Ecco un link che ho trovato parlando di più su questo sproc: weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx
Mike Cheel,

8

Seleziona Tutte le stored procedure e le visualizzazioni

select name,type,type_desc
from sys.objects
where type in ('V','P')
order by name,type

5

Questo può anche aiutare a elencare la procedura tranne le procedure di sistema:

select * from sys.all_objects where type='p' and is_ms_shipped=0

Non vi è alcun motivo per utilizzare sys.all_objectspoiché si sta filtrando is_ms_shipped=0. Può contenere trigger DDL, ma quelli verrebbero filtrati type='p'. Potresti anche usare sys.objects.
Solomon Rutzky,

4

Sfortunatamente INFORMATION_SCHEMAnon contiene informazioni sui proc di sistema.

SELECT *
  FROM sys.objects
 WHERE objectproperty(object_id, N'IsMSShipped') = 0
   AND objectproperty(object_id, N'IsProcedure') = 1

1
Perché dovresti usare questo invece di sys.procedures where is_ms_shipped = 0? E perché dovresti eseguire una funzione objectproperty(object_id, N'IsMSShipped')per ogni riga quando c'è un campo is_ms_shippedche contiene quel valore? Sulla stessa linea, perché eseguire di nuovo quella funzione quando [type] IN ('P', 'PC')fa la stessa cosa? Questo metodo è inutilmente complicato e inefficiente.
Solomon Rutzky,

4

Solo i nomi:

SELECT SPECIFIC_NAME  
FROM YOUR_DB_NAME.information_schema.routines  
WHERE routine_type = 'PROCEDURE'

3

Ho modificato l'eccellente post di LostCajun sopra per escludere le procedure memorizzate dal sistema. Ho anche rimosso "Estrai". dal codice perché non sono riuscito a capire a cosa serva e mi ha dato errori. L'istruzione "fetch next" all'interno del loop necessitava anche di una clausola "into".

use <<databasename>>
go

declare @aQuery nvarchar(1024);
declare @spName nvarchar(64);
declare allSP cursor for
    select p.name  
    from sys.procedures p 
    where p.type_desc = 'SQL_STORED_PROCEDURE' 
    and LEFT(p.name,3) NOT IN ('sp_','xp_','ms_')
    order by p.name;
open allSP;
fetch next from allSP into @spName;
while (@@FETCH_STATUS = 0)
begin
    set @aQuery = 'sp_helptext [' + @spName + ']';
    exec sp_executesql @aQuery;
    fetch next from allSP into @spName;
end;
close allSP;
deallocate allSP;

2

il modo migliore per ottenere oggetti è usare sys.sql_modules. puoi trovare tutto ciò che desideri da questa tabella e unire questa tabella con altre tabelle per ottenere ulteriori informazioni da object_id

SELECT o. object_id,o.name AS name,o.type_desc,m.definition,schemas.name scheamaName
FROM sys.sql_modules        m 
    INNER JOIN sys.objects  o ON m.object_id=o.OBJECT_ID
    INNER JOIN sys.schemas ON schemas.schema_id = o.schema_id
    WHERE [TYPE]='p'

1
select *  
  from dbo.sysobjects
 where xtype = 'P'
   and status > 0

status> 0 non sembra distinguere tra le procedure memorizzate dal sistema e quelle create

Hmm. Lo fa per noi - non so perché.
Bob Probst,

Chiunque utilizzi SQL Server 2005 o versioni successive dovrebbe allontanarsi dalle dbo.sys*visualizzazioni. Questa query filtra anche le stored procedure CLR.
Solomon Rutzky,

1

Ho scritto questo semplice tsql per elencare il testo di tutte le procedure memorizzate. Assicurati di sostituire il nome del tuo database nel campo.

use << database name >>
go

declare @aQuery nvarchar(1024);
declare @spName nvarchar(64);
declare allSP cursor for
select p.name  from sys.procedures p where p.type_desc = 'SQL_STORED_PROCEDURE' order by p.name;
open allSP;
fetch next from allSP into @spName;
while (@@FETCH_STATUS = 0)
begin
    set @aQuery = 'sp_helptext [Extract.' + @spName + ']';
    exec sp_executesql @aQuery;
    fetch next from allSP;
end;
close allSP;
deallocate allSP;

si prega di vedere la riscrittura di @BaffledBill di questo .. che ha funzionato per me. Questo non ha funzionato perché aveva molti errori.
ihightower,

1

Questo darà solo i nomi delle procedure memorizzate.

select specific_name
from information_schema.routines
where routine_type = 'PROCEDURE';

1

Questo mostrerà tutte le procedure memorizzate e il codice:

select sch.name As [Schema], obj.name AS [Stored Procedure], code.definition AS [Code] from sys.objects as obj
    join sys.sql_modules as code on code.object_id = obj.object_id
    join sys.schemas as sch on sch.schema_id = obj.schema_id
    where obj.type = 'P'

0

Questo, elenca tutte le cose che vuoi

In SQL Server 2005, 2008, 2012:

Use [YourDataBase]

EXEC sp_tables @table_type = "'PROCEDURE'" 
EXEC sp_tables @table_type = "'TABLE'"
EXEC sp_tables @table_type = "'VIEW'" 

O

SELECT * FROM information_schema.tables
SELECT * FROM information_schema.VIEWS

Non vi è alcun motivo per utilizzare o trarre vantaggio dall'uso di sp_tables. Inoltre, "PROCEDURA" non è un'opzione valida per sp_tables. Le uniche opzioni per @table_typesono: 'TABELLA SISTEMA', 'TABELLA' e 'VISUALIZZA'.
Solomon Rutzky,

0

Questo restituirà tutto il nome sp

Select * 
FROM sys.procedures where [type] = 'P' 
     AND is_ms_shipped = 0 
     AND [name] not like 'sp[_]%diagram%'

La condizione su [type]dovrebbe essere [type] IN ('P', 'PC')altrimenti stai filtrando qualsiasi proc memorizzato CLR potenzialmente presente.
Solomon Rutzky,


0
select * from DatabaseName.INFORMATION_SCHEMA.ROUTINES where routine_type = 'PROCEDURE'

select * from DatabaseName.INFORMATION_SCHEMA.ROUTINES where routine_type ='procedure' and left(ROUTINE_NAME,3) not in('sp_', 'xp_', 'ms_')


   SELECT name, type   FROM dbo.sysobjects
 WHERE (type = 'P')

0
USE DBNAME

select ROUTINE_NAME from information_schema.routines 
where routine_type = 'PROCEDURE'


GO 

Questo funzionerà su mssql.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.