代码之家  ›  专栏  ›  技术社区  ›  goofyui

如何从存储过程/函数中获取代码注释并填充到表中?

  •  0
  • goofyui  · 技术社区  · 6 年前

    如何从存储过程/函数中获取代码注释并填充到表中?

    /*
    Author : Test
    Comment : Test
    */
    

    我正在处理一个用户定义的函数,通过传递一个存储过程或函数作为输入参数来读取代码历史注释并将其存储在表中。在表格中保留输入的版本注释的详细信息。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Hasan Mahmood    6 年前

    您可以创建一个函数/存储过程来实现这一点:

    CREATE FUNCTION InsertCommentIntoTable
    (   
        @Param1 VARCHAR(200)
    )
    RETURNS int
    AS
    BEGIN
        -- Declare the return variable here
    
        DECLARE @str VARCHAR(max)
        SELECT @str = definition  
        FROM sys.sql_modules  
        WHERE object_id = (OBJECT_ID(N'dbo.CustOrderHist'));
    
        --parse @str string value and do your stuffs: @str has the function and stored procedure codes.
    
        RETURN 0;
    
    END
    GO
    
        2
  •  1
  •   Daniel Brughera    6 年前

    检查这个,有不同的方法来获得定义,我更喜欢 sp_helptext 因为它已经被分割成几行了

    DECLARE @Objects TABLE(name varchar(100))
    DECLARE @Lines TABLE(id int identity, line varchar(maX))
    
    INSERT @Objects
    SELECT name FROM sys.objects WHERE Type in ('FN', 'IF', 'P', 'TR', 'TF') 
    
    DECLARE @ObjectName VARCHAR(100)
    WHILE EXISTS (SELECT 1 FROM @Objects)
    BEGIN
        SELECT TOP 1 @ObjectName = name FROM @Objects
    
        DELETE @Lines
    
        INSERT @Lines (line)
        exec sp_helptext @ObjectName
    
        DECLARE @Linestart INT, @LineEnd INT
        WHILE EXISTS(SELECT 1 FROM @Lines WHERE charindex('/*', line) > 0)
        BEGIN
            SELECT TOP 1 @Linestart = id
            FROM @Lines WHERE charindex('/*', line) > 0
            ORDER BY id
    
            SELECT TOP 1 @LineEnd = id
            FROM @Lines WHERE charindex('*/', line) > 0
            ORDER BY id
    
            DECLARE @comment VARCHAR(MAX) = ''
    
            SELECT @Coment = @coment + char(13) + char(10) + line
            FROM @Lines 
            WHERE id between @LineStart and @lineEnd
    
            INSERT INTO yourtable (@objectName, @Comment)
    
            DELETE @Lines WHERE id between @LineStart and @lineEnd
        END
    
    
        DELETE @Objects WHERE name = @ObjectName
    END