【问题标题】:SQL comment header examples [closed]SQL 注释标头示例 [关闭]
【发布时间】:2010-11-08 07:28:55
【问题描述】:

也想看看人们的存储过程/函数等评论标题是什么样的(所以发布你的例子)......我只真正看到了 SQL Server Management Studio 创建的内容,但对其他人的样子很感兴趣...格式、使用的字符、程序信息/细节等我猜是真正让它们与众不同的原因...

SQL Server Management Studio(版本9)存储过程注释头默认:

-- =============================================
-- Author:      Name
-- Create date: 
-- Description: 
-- =============================================

【问题讨论】:

  • 永远不要使用行 cmets (--),使用块 cmets (/* */),如果您在行格式方面遇到问题,您将陷入 cmets 地狱。
  • 您能否详细说明@GabrielGuimaraes?我有很多带有 line cmets 的脚本,但之前没有意识到这一点:我应该注意什么?
  • @GabrielGuimarães Management Studio 有一个名为“注释掉选定的行”的功能,它会为所有选定的行添加行注释。反函数“取消注释选定的行”从所有选定的行中删除前导行注释。对我来说效果很好。你有什么行格式问题?
  • 如果在旧 SQL 框上使用过程 sp_helptext 来获取过程的脚本,则行没有中断,因此结果是单行,因此您无法知道评论应该在哪里结束。
  • @GabrielGuimarães +1:Line cmets 在格式化方面节省了很多麻烦 - 恕我直言。

标签: sql comments


【解决方案1】:

我知道这篇文章很古老,但格式良好的代码永远不会过时。

我在所有程序中都使用此模板。有些人不喜欢冗长的代码和 cmets,但作为一个经常需要更新自 90 年代中期以来未触及的存储过程的人,我可以告诉您编写格式良好且注释繁多的代码的价值。许多内容尽可能简洁,有时可能需要数天才能掌握程序的意图。通过简单地阅读一段代码很容易看出它在做什么,但在没有适当注释的情况下理解代码的意图要困难得多(有时甚至是不可能的)。

解释它就像你正在引导一个初级开发人员通过它。假设阅读它的人对它正在处理的功能领域知之甚少,并且对 SQL 的理解有限。为什么?很多时候,人们必须查看程序才能理解它们,即使他们无意或不打算修改它们。

/***************************************************************************************************
Procedure:          dbo.usp_DoSomeStuff
Create Date:        2018-01-25
Author:             Joe Expert
Description:        Verbose description of what the query does goes here. Be specific and don't be
                    afraid to say too much. More is better, than less, every single time. Think about
                    "what, when, where, how and why" when authoring a description.
Call by:            [schema.usp_ProcThatCallsThis]
                    [Application Name]
                    [Job]
                    [PLC/Interface]
Affected table(s):  [schema.TableModifiedByProc1]
                    [schema.TableModifiedByProc2]
Used By:            Functional Area this is use in, for example, Payroll, Accounting, Finance
Parameter(s):       @param1 - description and usage
                    @param2 - description and usage
Usage:              EXEC dbo.usp_DoSomeStuff
                        @param1 = 1,
                        @param2 = 3,
                        @param3 = 2
                    Additional notes or caveats about this object, like where is can and cannot be run, or
                    gotchas to watch for when using it.
****************************************************************************************************
SUMMARY OF CHANGES
Date(yyyy-mm-dd)    Author              Comments
------------------- ------------------- ------------------------------------------------------------
2012-04-27          John Usdaworkhur    Move Z <-> X was done in a single step. Warehouse does not
                                        allow this. Converted to two step process.
                                        Z <-> 7 <-> X
                                            1) move class Z to class 7
                                            2) move class 7 to class X

2018-03-22          Maan Widaplan       General formatting and added header information.
2018-03-22          Maan Widaplan       Added logic to automatically Move G <-> H after 12 months.
***************************************************************************************************/

除了这个标头之外,您的代码还应该有很好的注释和从上到下的概述。向主要功能部分添加注释块,例如:

/***********************************
**  Process all new Inventory records
**  Verify quantities and mark as
**  available to ship.
************************************/

添加大量内联 cmets,解释除最基本的标准外的所有标准,并始终格式化代码以提高可读性。长的垂直缩进页面比宽的短页面更好,并且当其他人支持您的代码时,可以更容易地查看代码块的开始和结束位置。有时,宽的、非缩进的代码更具可读性。如果是这样,请使用它,但仅在必要时使用。

UPDATE Pallets
SET class_code = 'X'
WHERE
    AND class_code != 'D'
    AND class_code = 'Z' 
    AND historical = 'N'
    AND quantity > 0
    AND GETDATE() > DATEADD(minute, 30, creation_date)
    AND pallet_id IN ( -- Only update pallets that we've created an Adjustment record for
        SELECT Adjust_ID
        FROM Adjustments
        WHERE
            AdjustmentStatus = 0
            AND RecID > @MaxAdjNumber

编辑

我最近放弃了横幅样式的注释块,因为随着代码的不断更新,顶部和底部的 cmets 很容易分离。您最终可能会在注释块中使用逻辑上独立的代码,这些代码说它们属于一起,这会产生比它解决的问题更多的问题。我已经开始围绕与 BEGIN ... END 块一起属于的多个语句部分,并将我的流 cmets 放在每个语句的第一行旁边。这样做的好处是让您可以折叠代码块并能够清楚地阅读高级流 cmets,并且当您打开一个部分时,您将能够对其中的各个语句执行相同的操作。这也非常适合高度嵌套的代码级别。当您的 proc 开始进入 200-400 行范围并且不会将任何行批量添加到已经很长的过程中时,这是非常宝贵的。

展开

已折叠

【讨论】:

  • 一切都取决于您的环境。信不信由你,有些地方唯一的数据库代码版本控制手段是在备份中。纯度测试对开发人员来说是有趣的练习,但在现实世界中,有很多事情阻止它们成为现实。 “过程名称”将过程名称保留在您可以看到的顶部。当然,实际的 proc 名称可能会偏离标题中未被注意的名称,但人们也可能忘记签入他们的代码。没有什么是完美的。 耸耸肩
  • 这个标头实际上是作为一个高度数据驱动组织的源代码控制路径开始的。数百个数据库和数十个 SQL Server 实例中有数千个过程。第一周,我使用 RegGate 的 SQL 源代码控制建立了团队,并让他们检查了更改。这对于未来的变化非常有用,但是 git 之前的历史呢?有一些包含 cmets 的 procs 可以追溯到 1998 年,幸运的是日期。每当更新过程时,所有这些注释都会按时间顺序汇总在顶部。
  • 依赖工具不会在动态查询中发现依赖关系。虽然我们都讨厌动态查询并希望它们像一千个太阳的火焰一样燃烧,但有些我们无法消除......反正还没有。他们将需要数十名开发人员在合理的时间范围内更新所有内容,并且像大多数地方一样,他们甚至难以找到足够的开发人员来跟上关键项目的步伐。实际上很少有 proc 包含所有这些字段,它们通常只有那些真正有用的字段。对于许多事情来说,这个列表要短得多。
  • 去年,就在 COVID 爆发之前,我联系了 2009 年创建 proc 的人,他仍在组织中,他们能够帮助我了解我正在处理的 proc 的意图。我没想到他们会记得,但我很绝望,我可以确切地知道代码在做什么,但它为什么这样做是一个谜,代码本身永远不会透露。有时了解作者可以帮助您理解代码,因为您已经看过他们编写的足够多的东西。希望这会有所帮助!
  • 确实如此;你是绝对正确的——当然有理由完全按照你的描述去做。我在那里工作过,在文件共享存储大量杂乱无章的脚本的混乱 devops 场景中。我的观点是,组织中的某个人需要退后一步并为此负责。如果环境是“现代的”,那么评论只需是版权声明和脚本的简要提要,任何人都可以调用它。如果需要在脚本中维护这一点,您的脑海中应该会响起警钟。
【解决方案2】:

看看这是否符合你的要求:

/*  

* Notes on parameters: Give the details of all parameters supplied to the proc  

* This procedure will perform the following tasks: 
 Give details description of the intent of the proc  

* Additional notes: 
Give information of something that you think needs additional mention, though is not directly related to the proc  

* Modification History:
  07/11/2001    ACL    TICKET/BUGID        CHANGE DESCRIPTION


*/

【讨论】:

    【解决方案3】:

    这是我的首选变体:

    /* =====================================================================
    DESC:   Some notes about what this does
               tabbed in if you need additional lines
    NOTES:  Additional notes
               tabbed in if you need additional lines
    ======================================================================== */
    

    【讨论】:

      【解决方案4】:

      这是我目前使用的。三重注释 ( / * / * / * ) 用于从对象定义中挑选出标头 cmets 的集成。

      /*/*/*
      
          Name:           pr_ProcName
          Author:         Joe Smith
          Written:        6/15/16
          Purpose:        Short description about the proc.
      
          Edit History:   6/15/16 - Joe Smith
                              + Initial creation.
                          6/22/16 - Jaden Smith
                              + Change source to blahblah
                              + Optimized JOIN
                          6/30/16 - Joe Smith
                              + Reverted changes made by Jaden.
      
      */*/*/
      

      【讨论】:

      • 这是哪个集成?现成的还是定制的?
      • @unfinishedmonkey custom - 我构建了一个进程,用于扫描对象的模式并将 cmets 存储在表中。
      【解决方案5】:

      我们使用这样的东西,对我非常有用。

      /*  
      Description:   
      Author:   
      Create Date: 
      Param:   
      Return:   
      Modified Date:  
      Modification:   
      */  
      

      【讨论】:

        【解决方案6】:
        -------------------------------------------------------------------------------
        -- Author       name
        -- Created      date
        -- Purpose      description of the business/technical purpose
        --              using multiple lines as needed
        -- Copyright © yyyy, Company Name, All Rights Reserved
        -------------------------------------------------------------------------------
        -- Modification History
        --
        -- 01/01/0000  developer full name  
        --      A comprehensive description of the changes. The description may use as 
        --      many lines as needed.
        -------------------------------------------------------------------------------
        

        【讨论】:

          【解决方案7】:
          set timing on <br>
          set linesize 180<br>
          spool template.log
          
          /*<br>
          ##########################################################################<br>
          -- Name : Template.sql<br>
          -- Date             : (sysdate) <br>
          -- Author           :   Duncan van der Zalm - dvdzalm<br>
          -- Company          :   stanDaarD-Z.nl<br>
          -- Purpose          :   <br>
          -- Usage        sqlplus <br>
          -- Impact   :<br>
          -- Required grants  :   sel on A, upd on B, drop on C<br>
          -- Called by        :   some other process<br
          ##########################################################################<br>
          -- ver  user    date        change  <br>
          -- 1.0  DDZ 20110622    initial<br>
          ##########################################################################<br>
          */<br>
          
          sho user<br>
          
          select name from v$database;
          
          select to_char(sysdate, 'Day DD Month yyyy HH24:MI:SS') "Start time"
          from dual
          ;
          
          
          -- script
          
          
          select to_char(sysdate, 'Day DD Month yyyy HH24:MI:SS') "End time"
          from dual
          ;
          
          spool off
          

          【讨论】:

            【解决方案8】:
            -- Author: 
            --
            -- Original creation date: 
            --
            -- Description: 
            

            【讨论】:

              【解决方案9】:

              我们目前使用的标头是这样的:

              ---------------------------------------------------
              -- Produced By   : Our company  
              -- URL       : www.company.com  
              -- Author        : me   
              -- Date      : yesterday    
              -- Purpose       : to do something  
              -- Called by     : some other process   
              -- Modifications : some other guy - today - to fix my bug   
              ------------------------------------------------------------
              

              附带说明,我在 SQL 中放置的任何 cmets 始终使用以下格式:

              /* 评论 */

              和过去一样,我在脚本(由 SQL Server 编写)会做一些有趣的事情时会遇到问题,将行环绕并且 cmets 开始 - 已注释掉所需的 SQL....但这可能只是我。

              【讨论】:

              • “日期:昨天”哈哈
              【解决方案10】:
              --
              -- STORED PROCEDURE
              --     Name of stored procedure.
              --
              -- DESCRIPTION
              --     Business description of the stored procedure's functionality.
              --
              -- PARAMETERS
              --     @InputParameter1
              --         * Description of @InputParameter1 and how it is used.
              --
              -- RETURN VALUE
              --         0 - No Error.
              --     -1000 - Description of cause of non-zero return value.
              --
              -- PROGRAMMING NOTES
              --     Gotchas and other notes for your fellow programmer.
              --
              -- CHANGE HISTORY
              --     05 May 2009 - Who
              --        * More comprehensive description of the change than that included with the
              --          source code commit message.
              --
              

              【讨论】:

                【解决方案11】:
                -- [why did we write this?]
                -- [auto-generated change control info]
                

                【讨论】:

                • 没错。记录为什么比什么更有价值。虽然作为初学者,我更喜欢为什么,什么以及如何。 :)
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2013-08-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-09-24
                • 1970-01-01
                • 2012-12-23
                相关资源
                最近更新 更多