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.

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

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

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'

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

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

10

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

select *
  from sys.procedures
 where is_ms_shipped = 0

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

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

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

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

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'

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;

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'

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

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;

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

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'

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

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

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

0
USE DBNAME

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


GO 

Esto funcionará en mssql.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.