2008-10-20 9 views

Respuesta

369

Como se ha dicho Mike, la mejor manera es utilizar information_schema. Siempre que no esté en la base de datos master, no se devolverán los procedimientos almacenados del sistema.

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

Si por alguna razón que habías no es del sistema procedimientos almacenados en la base de datos principal, se puede utilizar la consulta (esto filtrará 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_') 
+2

Si crea diagramas de base de datos, puede obtener un grupo de procesos que comiencen con 'dt_' en su base de datos, que también puede filtrar. –

+0

+1 para el esquema de información. vale la pena leer: http://msdn.microsoft.com/en-us/library/ms186778.aspx – Shiham

+0

Debe ser "Siempre y cuando no esté en las bases de datos [maestra] o [msdb], ..." –

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

estado no parece> 0 para diferenciar entre los procedimientos almacenados del sistema y los creados –

+0

Hmm . Lo hace por nosotros, no sé por qué. –

+0

Cualquiera que use SQL Server 2005 o posterior debería alejarse de las vistas 'dbo.sys *'. Esta consulta también filtra los procedimientos almacenados CLR. –

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

Esto funcionó para mí en un entorno compartido en MS-SQL 2008; los dos anteriores no ... – Realto619

+3

Cualquiera que use SQL Server 2005 o posterior debería alejarse de las vistas 'dbo.sys *'. Esta consulta también: filtra los procedimientos almacenados de CLR, no filtra los procesos almacenados del sistema y devuelve [tipo] cuando se sabe que [tipo] siempre será 'P' ya que es la condición WHERE. –

24

Desde mi entender el método "preferido" es el uso de las tablas INFORMATION:

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

los registros devueltos no parecen tener una manera de diferenciar los procedimientos almacenados del sistema –

3

Desafortunadamente INFORMATION_SCHEMA doesn' Contiene información sobre los procesos del sistema.

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

¿Por qué usar esto en lugar de 'sys.procedures donde is_ms_shipped = 0'? ¿Y por qué ejecutar una función 'objectproperty (object_id, N'IsMSShipped ')' para cada fila cuando hay un campo 'is_ms_shipped' que contiene ese valor? En esas mismas líneas, ¿por qué ejecutar esa función nuevamente cuando '[type] IN ('P', 'PC')' hace lo mismo? Este método es innecesariamente complicado e ineficiente. –

9

Si está utilizando SQL Server 2005, el siguiente trabajo:

select * 
    from sys.procedures 
where is_ms_shipped = 0 
+0

esto dará el resultado incorrecto e incluirá el sistema como el procedimiento almacenado en el diagrama (sp_upgraddiagrams) en sql 2008 – HaveNoDisplayName

+0

@Piyush Es cierto que devolverá los diagramas de proceso, pero alguien _might_ no los considerará procs del "sistema" ya que no vinieron con la instalación estándar. El O.P. no especificó cómo manejar eso, así que no filtrarlos no es necesariamente incorrecto. –

+0

@srutzky: - pero aún no son sp creados por el usuario – HaveNoDisplayName

4

Esto también puede ayudar a la lista procedimiento, excepto los procedimientos del sistema:

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

No hay ninguna razón para usar 'sys.all_objects' ya que está filtrando en' is_ms_shipped = 0'. Puede contener activadores DDL, pero estos se filtrarán por 'type = 'p''. También podría usar 'sys.objects'. –

1

Este, una lista de todas las cosas que desea

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

No hay ninguna razón para usar, o beneficiarse del uso, 'sp_tables'. Además, "PROCEDIMIENTO" no es una opción válida para 'sp_tables'. Las únicas opciones para '@ table_type' son: 'SYSTEM TABLE', 'TABLE' y 'VIEW'. –

7

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

SELECT * FROM sys.procedures 
+0

esto ha sido modificado y crea una fecha, etc. que es muy útil – ihightower

1

escribí este sencillo tsql para listar 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; 
+0

por favor vea la reescritura de @BaffledBill de esto ... que funcionó para mí. Este no funcionó ya que tenía muchos errores. – ihightower

0

Esta voluntad devuelto todo nombre sp

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

La condición en '[type]' debe ser '[type] IN ('P', 'PC')' de lo contrario está filtrando los procesos almacenados CLR que potencialmente existen. –

11

Puede probar esta consulta para obtener procedimientos almacenados y funciones:

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 
0

a la lista de los procedimientos almacenados para una base de datos MySQL en particular:

SHOW PROCEDURE STATUS WHERE db = 'databaseName'; 
+1

mal db - este es un comando de MySQL – bhs

1

This will dar solo los nombres de los procedimientos almacenados.

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

Puede utilizar una de las consultas siguientes para encontrar la lista de procedimientos almacenados en una base de datos:

Consulta1:

SELECT 
     * 
    FROM sys.procedures; 

Query2:

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

Si desea encontrar la lista de todos los SP en todas las bases de datos que pueda utilizar la consulta a continuación:

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 su ejemplo usando el sp_msforeachdb es dorado y debería ser la respuesta. Aquí hay un enlace que encontré hablando más sobre este sproc: http://weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx –

1

he pellizcado excelente post de LostCajun por encima de excluir los procedimientos almacenados del sistema. También eliminé "Extracto". del código porque no pude entender para qué era y me dio errores. La instrucción "buscar siguiente" dentro del ciclo 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

Seleccionar todos los procedimientos almacenados y vistas

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

Sólo los nombres:

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