2008-11-14 1 views
15

Я хочу запрос, который возвращает список всех (пользовательских) хранимых процедур в базе данных по имени, с количеством строк кода для каждого из них ,Запросить список хранимых процедур SQL Server вместе с строками кода для каждой процедуры

т.е.

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

Любые идеи, как это сделать?

+0

Как вы рассчитываете "линии"? Произвольное количество символов, количество строк/возврат каретки или что? – 2008-11-14 22:09:17

+0

Возврат строки/каретки - вроде как вы видели бы в Mgt Studio, когда вы написали CREATE PROC для proc. Но он не должен быть на 100% точным. – 2008-11-16 23:28:07

+0

Просто достаточно, чтобы получить приблизительное представление о сложности в базе данных. – 2008-11-16 23:28:44

ответ

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 

ред поэтому он должен теперь также работает в SQL Server 2000- 2008 и исключить базы данных Диаграмма связанных sprocs и funcs (которые появляются, как пользователь созданных объектов).

+0

Это не работает - он извлекает несколько разных результатов для одной и той же хранимой процедуры. – 2008-11-16 23:34:30

2

Это работает для 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 
7

FWIW, вот еще один:

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' 
Смежные вопросы