SQL Server SP, функция, счетчик строк исходного кода - PullRequest
1 голос
/ 13 июля 2009

Существует ли какая-либо утилита для подсчета общего количества строк созданной пользователем хранимой процедуры, функции, представления в базе данных?

Ответы [ 2 ]

2 голосов
/ 13 июля 2009

Для SQL Server 2005 и 2008.

Это включает в себя весь код, включая пустые и конечные пустые строки, но не последнюю строку (без CRLF). Так что это в среднем ... но это всегда было бы приближением в любом случае.

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: Вам может понадобиться OBJECTPROPERTY(SM.[object_ID], 'IsMSShipped') = 0 или явные исключения для кода диаграммы и т. Д.

Редактировать 2:

Из другого решения в другом ответе исправлено, чтобы не давать «-1» для проверочных ограничений и применять те же фильтры / типы

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

Они все дают одинаковые результаты в нескольких базах данных. например, 4607 для базы данных сервера отчетов SQL Server 2005 с пакетом обновления 2 (SP2) ...

0 голосов
/ 13 июля 2009

Не то, что я знаю, но вы могли бы просмотреть материал в sysobjects и выполнить sp_helptext для каждого процесса, а также просмотреть и подсчитать переводы строки.

Если вы хотите решение, не основанное на CTE, вы можете сделать что-то вроде этого:

select sum(newlines) from 
(
select newlines = (datalength(definition) - datalength(replace(definition, '
', ' '))) / 2 from sys.sql_modules
) as a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...