Consulta para enumerar todos los procedimientos almacenados

338

Qué consulta puede devolver los nombres de todos los procedimientos almacenados en una base de datos de SQL Server

Si la consulta pudiera excluir los procedimientos almacenados del sistema, eso sería aún más útil.

p.campbell
fuente

Respuestas:

499

Como dijo Mike, la mejor manera es usarlo information_schema. Mientras no esté en la base de datos maestra, no se devolverán los procedimientos almacenados del sistema.

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

Si por alguna razón tuvo procedimientos almacenados que no son del sistema en la base de datos maestra, puede usar la consulta (esto filtrará la MAYORÍA de los procedimientos almacenados del sistema):

SELECT * 
  FROM [master].INFORMATION_SCHEMA.ROUTINES
 WHERE ROUTINE_TYPE = 'PROCEDURE' 
   AND LEFT(ROUTINE_NAME, 3) NOT IN ('sp_', 'xp_', 'ms_')
Dave_H
fuente
3
Si crea diagramas de base de datos, puede obtener un montón de procesos que comienzan con 'dt_' en su base de datos que también puede filtrar.
John Fouhy
+1 para el esquema de información. Vale la pena leerlo: msdn.microsoft.com/en-us/library/ms186778.aspx
Shiham
Debería ser "Mientras no esté en las bases de datos [maestra] o [msdb], ..."
Solomon Rutzky
107
SELECT name, 
       type
  FROM dbo.sysobjects
 WHERE (type = 'P')
Kevin
fuente
44
Esto funcionó para mí en un entorno compartido en MS-SQL 2008; los dos anteriores no ...
Realto619
3
Cualquier persona que use SQL Server 2005 o posterior debe alejarse de las dbo.sys*vistas. Esta consulta también: filtra los procedimientos almacenados CLR, no filtra los procesos almacenados del sistema y devuelve [type] cuando se sabe que [type] siempre será 'P' ya que es la condición WHERE.
Solomon Rutzky
no funcionará si los objetos en la base de datos tienen un esquema diferente
Foyzul Karim
30

Según tengo entendido, el método "preferido" es usar las tablas de información_esquema:

select * 
  from information_schema.routines 
 where routine_type = 'PROCEDURE'
Miguel
fuente
los registros devueltos no parecen tener una manera de diferenciar los procedimientos almacenados del sistema
18

Lo siguiente devolverá todos los procedimientos en la base de datos seleccionada

SELECT * FROM sys.procedures
Narendra Sharma
fuente
esto se modificó y creó la fecha, etc., lo cual es muy útil
ihightower
14

Puede probar esta consulta para obtener procedimientos y funciones almacenados:

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
MovGP0
fuente
10

Si está utilizando SQL Server 2005, lo siguiente funcionará:

select *
  from sys.procedures
 where is_ms_shipped = 0
cbeuker
fuente
esto dará un resultado incorrecto e incluirá un sistema como diagrama de procedimiento almacenado (sp_upgraddiagrams) en sql 2008
HaveNoDisplayName
@Piyush Es cierto que devolverá los procs del diagrama, pero alguien podría no considerarlos como procs del "sistema" ya que no vinieron con la instalación estándar. El OP no especificó cómo manejar eso, por lo que no filtrarlos no es necesariamente incorrecto.
Solomon Rutzky
@srutzky: - pero aún así no son sp's creados por el usuario
HaveNoDisplayName
@Piyush True, pero como dije, el OP no especificó cómo manejar los procesos que no son "creados por el usuario" ni "sistema". Y nadie ha preguntado.
Solomon Rutzky
Gran respuesta. Gracias por incluir "is_ms_shipped = 0."
Hans Vonn
8

Puede usar una de las siguientes consultas para encontrar la lista de Procedimientos almacenados en una base de datos:

Consulta1:

    SELECT 
        *
    FROM sys.procedures;

Consulta2:

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

Si desea encontrar la lista de todos los SP en todas las bases de datos , puede usar la siguiente consulta:

    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
Ardalan Shahgholi
fuente
1
OMI, su ejemplo usando sp_msforeachdb es oro y debería ser la respuesta. Aquí hay un enlace que encontré hablando más sobre este programa: weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx
Mike Cheel
8

Seleccione todos los procedimientos almacenados y vistas

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

Esto también puede ayudar a enumerar el procedimiento, excepto los procedimientos del sistema:

select * from sys.all_objects where type='p' and is_ms_shipped=0
Nunca sin esperanza
fuente
No hay razón para usar, sys.all_objectsya que está filtrando is_ms_shipped=0. Puede contener disparadores DDL, pero esos serían filtrados por type='p'. También podrías usarlo sys.objects.
Solomon Rutzky
4

Lamentablemente INFORMATION_SCHEMAno contiene información sobre los procs del sistema.

SELECT *
  FROM sys.objects
 WHERE objectproperty(object_id, N'IsMSShipped') = 0
   AND objectproperty(object_id, N'IsProcedure') = 1
Cade Roux
fuente
1
¿Por qué usarías esto en lugar de sys.procedures where is_ms_shipped = 0? ¿Y por qué ejecutaría una función objectproperty(object_id, N'IsMSShipped')para cada fila cuando hay un campo is_ms_shippedque contiene ese valor? En esa misma línea, ¿por qué ejecutar esa función nuevamente cuando [type] IN ('P', 'PC')hace lo mismo? Este método es innecesariamente complicado e ineficiente.
Solomon Rutzky
4

Solo los nombres:

SELECT SPECIFIC_NAME  
FROM YOUR_DB_NAME.information_schema.routines  
WHERE routine_type = 'PROCEDURE'
Ray Koren
fuente
3

Modifiqué la excelente publicación de LostCajun anterior para excluir los procedimientos almacenados del sistema. También eliminé "Extracto". del código porque no pude entender para qué sirve y me dio errores. La declaración "buscar siguiente" dentro del bucle también necesitaba una cláusula "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;
Desconcertado
fuente
2

la mejor manera de obtener objetos es usar sys.sql_modules. puede encontrar todo lo que desee de esta tabla y unir esta tabla con otra tabla para obtener más información por 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'
Mohsen
fuente
1
select *  
  from dbo.sysobjects
 where xtype = 'P'
   and status > 0
Bob Probst
fuente
status> 0 no parece diferenciar entre los procedimientos almacenados del sistema y los creados
Hmm Lo hace por nosotros, no sé por qué.
Bob Probst
Cualquier persona que use SQL Server 2005 o posterior debe alejarse de las dbo.sys*vistas. Esta consulta también filtra los procedimientos almacenados CLR.
Solomon Rutzky
1

Escribí este simple tsql para enumerar el texto de todos los procedimientos almacenados. Asegúrese de sustituir el nombre de su base de datos en el 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;
LostCajun
fuente
vea la reescritura de @BaffledBill de esto ... que funcionó para mí. Este no funcionó ya que tenía muchos errores.
ihightower
1

Esto le dará solo los nombres de los procedimientos almacenados.

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

Esto mostrará todos los procedimientos almacenados y el código:

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'
Alexandru-Codrin Panaite
fuente
0

Esto, enumera todas las cosas que quieres

En 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
Reza Zendehboudi
fuente
No hay razón para usar, o beneficiarse de usar sp_tables,. Además, "PROCEDIMIENTO" no es una opción válida para sp_tables. Las únicas opciones para @table_typeson: 'TABLA DEL SISTEMA', 'TABLA' y 'VER'.
Solomon Rutzky
0

Esto devolverá todo el nombre de sp

Select * 
FROM sys.procedures where [type] = 'P' 
     AND is_ms_shipped = 0 
     AND [name] not like 'sp[_]%diagram%'
HaveNoDisplayName
fuente
La condición [type]debería ser [type] IN ('P', 'PC')si no está filtrando los procesos almacenados CLR que están potencialmente allí.
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')
Chandan Ravandur N
fuente
0
USE DBNAME

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


GO 

Esto funcionará en mssql.

usuario1556937
fuente
0

Seleccione la lista de procedimientos almacenados en el servidor SQL. Consulte aquí para obtener más información: https://coderrooms.blogspot.com/2017/06/select-list-of-stored-procedure-in-sql.html

Ankur Tiwari
fuente
1
Hola y bienvenido. Este código no parece hacer lo que sugiere el título. Parece crear un procedimiento almacenado que devuelve una lista de registros de una PaymentDetailstabla. El OP quiere una lista de procedimientos almacenados reales.
Jeremy Caney