2009-07-13 6 views

Répondre

2

Pour SQL Server 2005 et 2008.

Cela inclut tout le code, y compris des lignes blanches et de fuite des lignes vides, mais pas la dernière ligne (pas CRLF). Donc, c'est moyen ... mais ce serait toujours une approximation de toute façon.

WITH CRLF AS 
(
    SELECT 
     CHARINDEX(' 
', definition) AS CRLF, 
     SM.[object_ID] 
    FROM 
     sys.sql_modules SM 
WHERE 
    OBJECT_NAME([object_ID]) not in ('fn_diagramobjects', 'sp_alterdiagram', 'sp_creatediagram', 'sp_dropdiagram', 'sp_helpdiagramdefinition', 'sp_helpdiagrams', 'sp_renamediagram', 'sp_upgraddiagrams', 'sysdiagrams') 
    UNION ALL 
    SELECT 
     CHARINDEX(' 
', definition, C.CRLF + 2), 
     SM.[object_ID] 
    FROM 
     sys.sql_modules SM 
     JOIN 
     CRLF C ON SM.[object_ID] = C.[object_ID] 
    WHERE 
     CHARINDEX(' 
', definition, C.CRLF + 2) > C.CRLF 
) 
SELECT 
    COUNT(*) 
FROM 
    CRLF 
OPTION 
    (MAXRECURSION 0) 

Edit: Vous devrez peut-être OBJECTPROPERTY(SM.[object_ID], 'IsMSShipped') = 0 ou explicitement exclusions pour le code de diagramme etc

Edit 2:

De l'autre solution en réponse otehr, corrigées pour ne pas donner "-1" pour les contraintes de vérification et appliquer les mêmes filtres/types

select t.sp_name, sum(t.lines_of_code) as lines_ofcode, t.type_desc 
from 
(
    select o.name as sp_name, 
    (len(c.text) - len(replace(c.text, char(13), ''))) 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 ('V', 'P', 'FN', 'IF', 'TF', 'TR') 
    --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 
COMPUTE SUM (sum(t.lines_of_code)) 

Ils donnent tous les mêmes résultats ici sur plusieurs bases de données. 4607 pour une base de données SQL Server 2005 SP2 ReportServer ...

+0

en quelque sorte ma solution est à venir avec une diff réponse à la vôtre. –

+0

Merci gbn & Sam pour vos réponses. Essayé http://stackoverflow.com/questions/291574/query-to-list-sql-server-stored-procedures-along-with-lines-of-code-for-each-proc. Tous les trois donnent des résultats différents. Lequel considérer? –

+0

@Rajganesh: comment différent? – gbn

0

Pas que je sache, mais vous pouvez parcourir les éléments dans sysobjects et exécuter sp_helptext sur chaque proc et afficher et compter les retours à la ligne.

Si vous voulez une solution non CTE vous pourriez faire quelque chose comme ceci:

 
select sum(newlines) from 
(
select newlines = (datalength(definition) - datalength(replace(definition, ' 
', ' ')))/2 from sys.sql_modules 
) as a 
Questions connexes