代码之家  ›  专栏  ›  技术社区  ›  Simon D

查询以列出SQL Server存储过程以及每个过程的代码行

  •  17
  • Simon D  · 技术社区  · 16 年前

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

    有什么办法吗?

    4 回复  |  直到 16 年前
        1
  •  55
  •   Gordon Bell    16 年前
    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
    

    经过编辑,因此它现在也可以在SQLServer2000-2008中使用,并排除与数据库关系图相关的存储过程和函数(看起来像用户创建的对象)。

        2
  •  9
  •   Cade Roux    15 年前

    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]
    
        3
  •  2
  •   DJ.    16 年前

    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
    
        4
  •  -3
  •   fancyPants    12 年前
    select * from sysobjects where type = 'p'