【问题标题】:Query to list SQL Server stored procedures along with lines of code for each procedure查询以列出 SQL Server 存储过程以及每个过程的代码行
【发布时间】:2010-09-22 10:30:35
【问题描述】:

我想要一个查询,它按名称返回数据库中所有(用户)存储过程的列表,以及每个存储过程的代码行数。

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

任何想法如何做到这一点?

【问题讨论】:

  • 你是怎么数“行”的?任意数量的字符,换行/回车的数量,还是什么?
  • 换行/回车 - 有点像您在为 proc 编写 CREATE PROC 时在 Mgt Studio 中看到的。但它不需要 100% 准确。
  • 足以大致了解数据库的复杂性。

标签: sql sql-server tsql stored-procedures lines-of-code


【解决方案1】:
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 和 func(看起来像用户创建的对象)。

【讨论】:

  • 这似乎不起作用 - 它为同一个存储过程检索多个不同的结果。
  • Fred,我修复了它来处理重复的存储过程问题。多个 syscmets 行用于大型存储过程。
  • 我没有从上面的代码中得到任何结果。我正在使用 SQL2K8 EXPRESS 版本。 (我正在寻找一个查询来获取 FUNCTION 名称、输入和输出参数。)如果我只查询 sys.all_objects,我看不到 LTRIM、LEFT 等函数名称
  • 在 Sql Server 2008 中,我需要将最后两行代码更改为:'group by t.sp_name, t.type_desc, t.lines_of_code order by t.lines_of_code desc'
【解决方案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

【讨论】:

  • 这更像是 - sp_helptext 意味着我们非常接近 QA 会回馈的内容。但它需要放在表格中才能真正有用。
  • 您可以轻松地将 PRINT 命令更改为插入到另一个表中。
【解决方案3】:

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]

【讨论】:

  • 此查询适用于并行数据仓库/分析平台系统。
【解决方案4】:
select * from sysobjects where type = 'p'

【讨论】:

  • 这并没有给出存储过程的代码行数。
猜你喜欢
  • 2010-09-18
  • 2018-10-03
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多