2009-07-13 11 views

Antwort

2

für SQL Server 2005 und 2008

Dies umfasst alle Code einschließlich Leerzeilen und Leerzeilen Hinter, aber nicht die letzte Zeile (kein CRLF). Es sind also Mittelwerte ... aber es wäre sowieso immer eine Annäherung.

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: Sie OBJECTPROPERTY(SM.[object_ID], 'IsMSShipped') = 0 benötigen oder explizit Ausschlüsse für Diagrammcode usw.

Edit 2:

Von anderen Lösung in otehr Antwort, korrigiert nicht geben "-1" für Check-Einschränkungen und die gleichen Filter/Typen anwenden

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

Sie alle geben hier die gleichen Ergebnisse auf mehreren Datenbanken. zB 4607 für eine SQL Server 2005 SP2 ReportServer Datenbank ...

+0

irgendwie meine Lösung ist mit einer diff Antwort auf Ihr kommen. –

+0

Dank gb & Sam für Ihre Antworten. Versucht http://stackoverflow.com/questions/291574/query-to-list-sql-server-stored-procedures-along-with-lines-of-code-for-each-proc. Alle drei ergeben unterschiedliche Ergebnisse. Welchen zu berücksichtigen? –

+0

@Rajganesh: wie anders? – gbn

0

Nicht, dass ich weiß, aber Sie könnten durch die Sachen in sysobjects schauen und sp_helptext auf jedem proc ausführen und die Zeilenschaltungen anzeigen und zählen.

Wenn Sie eine nicht CTE basierte Lösung, die Sie so etwas tun könnte:

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