データベース内のすべての(ユーザー)ストアドプロシージャのリストを、名前ごとに、コード行数ごとに返すクエリが必要です。
つまり.
sp_name lines_of_code
-------- -------------
DoStuff1 120
DoStuff2 50
DoStuff3 30
これを行う方法はありますか?
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でも動作し、データベースダイアグラム関連のsprocおよびfuncs(ユーザーが作成したオブジェクトのように見える)を除外するように編集されました。
FWIW、もう1つあります。
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]
これは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