2012-09-27 19 views
9

¿Alguien puede aconsejar sobre una forma de enumerar todos los procedimientos almacenados junto con sus nombres de esquema en una base de datos? ¡Gracias!Lista de todos los procedimientos almacenados con el nombre de esquema

+1

tratar 'SELECT * FROM DatabaseName.information_schema.routines donde routine_type = 'PROCEDURE'' – aserwin

+0

Gracias, aserwin y marc_s. ¿Cómo sé que esto enumerará TODOS los procedimientos almacenados para esta base de datos b/c Ejecuté esto y obtuve 164 filas, en comparación con 1,510 registros cuando ejecuté otra consulta, que no guardé, por lo que no estoy seguro de qué se trataba :-(. – daniness

Respuesta

8

Prueba esto:

SELECT 
    SchemaName = s.name, 
    ProcedureName = pr.name 
FROM 
    sys.procedures pr 
INNER JOIN 
    sys.schemas s ON pr.schema_id = s.schema_id 

Esto debería enumerar todos los procedimientos almacenados y su nombre de esquema como un conjunto de resultados.

Ambas vistas - sys.procedures y sys.schemas - tienen bastantes más atributos - pruébelos, si los necesita, inclúyalos en su consulta.

+0

Gracias por su sugerencia. ¿Cómo usaría esto para enumerar todos los procedimientos almacenados y sus esquemas para una base de datos específica? – daniness

+0

@daniness: vaya a esa base de datos ('use (yourdatabase)') y luego ejecute este fragmento de código. Funciona solo en la base de datos en la que se encuentra actualmente. –

24
SELECT [schema] = OBJECT_SCHEMA_NAME([object_id]), 
    name 
FROM sys.procedures; 

o

SELECT [schema] = SCHEMA_NAME([schema_id]), 
    name 
FROM sys.procedures; 

Para una base de datos específica, sólo puede cambiar el contexto a la primera base de datos, o cambiar la pregunta de Marc ligeramente (mis preguntas no son buenos en este caso porque se basan en funciones que son sensibles al contexto):

SELECT 
    SchemaName = s.name, 
    ProcedureName = pr.name 
FROM 
    databasename.sys.procedures pr 
INNER JOIN 
    databasename.sys.schemas s ON pr.schema_id = s.schema_id; 

Si quieres hacer esto para todas las bases de datos:

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql += N' 
    UNION ALL SELECT db = N''' + name + ''', 
    s.name COLLATE Latin1_General_CI_AI, 
    o.name COLLATE Latin1_General_CI_AI 
    FROM ' + QUOTENAME(name) + '.sys.procedures AS o 
    INNER JOIN ' + QUOTENAME(name) + '.sys.schemas AS s 
    ON o.[schema_id] = s.[schema_id]' 
FROM sys.databases 
-- WHERE ... -- probably don't need system databases at least 

SELECT @sql = STUFF(@sql, 1, 18, '') 
    -- you may have to adjust ^^ 18 due to copy/paste, cr/lf, tabs etc 
    + ' ORDER BY by db, s.name, o.name'; 

EXEC sp_executesql @sql; 

Las cláusulas de intercalación son necesarias en caso de que tenga bases de datos con intercalaciones diferentes.

2

Esto le puede ayudar ..

SELECT * FROM sys.procedures;

+0

No devolverá todos los procedimientos. –

0

Puedes usar el Generador de scripts para obtenerlos. En el botón izquierdo, haga clic derecho en la base de datos para la cual desea obtener Procedimientos almacenados, Tareas-> Generar secuencias de comandos Haga clic en Siguiente y elija Seleccionar objetos de bases de datos específicos y seleccione Procedimientos almacenados y haga clic en Siguiente, allí puede personalizar y generar el guiones.

0

Prueba esto:

execute [sys].[sp_stored_procedures] 

O probar esto y también obtener todos los parámetros:

execute [sys].[sp_sproc_columns] 

Ok ... que tendrá que recorrer todos los nombres de catálogo de base de datos con esto, pero. ..

0
SELECT name,crdate FROM dbo.sysobjects WHERE (type = 'P') order by name 

SELECT [schema] = OBJECT_SCHEMA_NAME([object_id]),name FROM sys.procedures; 

select OBJECT_SCHEMA_NAME([object_id]) as 'SchemaName',name as 'SP Name ' , 

create_date,modify_date FROM sys.procedures order by OBJECT_SCHEMA_NAME([object_id]), name 
+1

Agregue alguna descripción, por qué funcionará y cómo funciona. – piyushj

Cuestiones relacionadas