2008-11-14 10 views
15

Deseo una consulta que devuelva una lista de todos los procedimientos almacenados (usuario) en una base de datos por nombre, con el número de líneas de código para cada uno .Consulta para enumerar los procedimientos almacenados de SQL Server junto con líneas de código para cada procedimiento

decir

sp_name  lines_of_code 
-------- ------------- 
DoStuff1 120 
DoStuff2 50 
DoStuff3 30 

¿Alguna idea de cómo hacer esto?

+0

¿Cómo estás contando "líneas"? ¿Número arbitrario de caracteres, número de salto de línea/retornos de carro, o qué? –

+0

Devolución de línea/retorno de carro: algo parecido a lo que vería en Mgt Studio cuando escribió CREATE PROC para el proceso. Pero no necesita ser 100% exacto. –

+0

Simplemente lo suficientemente bueno como para tener una idea aproximada de dónde está la complejidad en una base de datos. –

Respuesta

45
select t.sp_name, sum(t.lines_of_code) - 1 as lines_ofcode, t.type_desc 
from 
(
    select o.name as sp_name, 
    (len(c.text) - len(replace(c.text, char(10), ''))) as lines_of_code, 
    case when o.xtype = 'P' then 'Stored Procedure' 
    when o.xtype in ('FN', 'IF', 'TF') then 'Function' 
    end as type_desc 
    from sysobjects o 
    inner join syscomments c 
    on c.id = o.id 
    where o.xtype in ('P', 'FN', 'IF', 'TF') 
    and o.category = 0 
    and o.name not in ('fn_diagramobjects', 'sp_alterdiagram', 'sp_creatediagram', 'sp_dropdiagram', 'sp_helpdiagramdefinition', 'sp_helpdiagrams', 'sp_renamediagram', 'sp_upgraddiagrams', 'sysdiagrams') 
) t 
group by t.sp_name, t.type_desc 
order by 1 

Editado por lo que debe trabajar ahora también en SQL Server 2000- 2008 y para excluir sprocs y funcs relacionados diagrama de base de datos (que aparecen como objetos creados por el usuario).

+0

Esto no parece funcionar: recupera múltiples resultados diferentes para el mismo procedimiento almacenado. –

+0

Fred, lo arreglé para manejar el problema del procedimiento almacenado duplicado. Varias filas de syscomments se utilizan para grandes procedimientos almacenados. –

+0

Gracias GB, eso es exactamente lo que necesito. –

2

Esto funciona para MS-SQL 2000

SET NOCOUNT ON 

DECLARE @ProcName varchar(100) 
DECLARE @LineCount int 

DECLARE C CURSOR LOCAL FOR 
    SELECT o.name as ProcName FROM sysobjects o WHERE (o.xtype = 'P') ORDER BY o.name 

OPEN C 

CREATE TABLE #ProcLines ([Text] varchar(1000)) 

FETCH NEXT FROM C INTO @ProcName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    DELETE FROM #ProcLines 
    INSERT INTO #ProcLines EXEC('sp_helptext ' + @ProcName + '') 

    SELECT @LineCount = COUNT(*) FROM #ProcLines 

    PRINT @ProcName + ' Lines: ' + LTRIM(STR(@LineCount)) 

    FETCH NEXT FROM C INTO @ProcName 

END 

CLOSE C 

DEALLOCATE C 

DROP TABLE #ProcLines 
+0

Esto es más parecido - sp_helptext significa que estamos bastante cerca de lo que la QA le devolvería. Pero tiene que ir en una tabla para ser realmente útil. –

+0

Puede cambiar fácilmente el comando PRINT a una inserción en otra tabla. –

+0

Gracias DJ, esa es una forma inteligente de hacerlo. –

7

Fwiw, aquí hay otra:

SELECT o.type_desc AS ROUTINE_TYPE 
     ,QUOTENAME(s.[name]) + '.' + QUOTENAME(o.[name]) AS [OBJECT_NAME] 
     ,(LEN(m.definition) - LEN(REPLACE(m.definition, CHAR(10), ''))) AS LINES_OF_CODE 
FROM sys.sql_modules AS m 
INNER JOIN sys.objects AS o 
     ON m.[object_id] = o.[OBJECT_ID] 
INNER JOIN sys.schemas AS s 
     ON s.[schema_id] = o.[schema_id] 
-2
select * from sysobjects where type = 'p' 
+0

Esto no da la cantidad de líneas de código para un sproc. –

Cuestiones relacionadas