Handling of COMMENTS in the GDR

In the GDR you will mainly find large improvements, but it is not everything is better. One area where we regressed functionality is the deployment of comments inside T-SQL procedures, triggers,  functions etc. With the move to a true and only model based system, objects that are stored in dbo.syscomments or sys.sql_modules, are modeled in such a way that we separate out body script from the object name and parameters. We do this for a reason, so we when you rename an object we also update the actual name inside the script body. The nasty side effect is that all comment before the first real statement in the script body and after the last real statement in the script body as lost when deployed.

For example see the following stored procedure which has a comment line on every possible line.

    1:  -- comment line 1
    2:  CREATE PROCEDURE [dbo].[p_Comments] -- comment line 2
    3:  -- comment line 3
    4:       @param1 int = 0, -- comment line 4
    5:       @param2 int      -- comment line 5
    6:  -- comment line 6
    7:  AS -- comment line 7
    8:  -- comment line 8
    9:  BEGIN -- comment line 9
   10:      SET NOCOUNT ON -- comment line 10
   11:      -- comment line 11
   12:      SELECT @param1, @param2 -- comment line 12
   13:      -- comment line 13
   14:      RETURN 0 -- comment line 14
   15:  END -- comment line 15
   16:  -- comment line 16
   17:  GO -- comment line 17
   18:  -- comment line 18
   19:   

If you would inspect how this information is stored inside the model, by looking at the .DBSCHEMA file which is produced by the build step, it looks somewhat like this:

    1:  <Element Type="ISql100Procedure" Name="[dbo].[p_Comments]">
    2:       <Property Name="IsAnsiNullsOn" Value="True" />
    3:            <Property Name="BodyScript">
    4:                 <Value><![CDATA[BEGIN -- comment line 9
    5:      SET NOCOUNT ON -- comment line 10
    6:      -- comment line 11
    7:      SELECT @param1, @param2 -- comment line 12
    8:      -- comment line 13
    9:      RETURN 0 -- comment line 14
   10:  END]]></Value>
   11:            </Property>
   12:            ...
   13:  </Element>

This fragment indicates that the script body starts at the first statement, in this case the BEGIN statement and ends at the END statements. Comments between those to statements are preserved when deploying, the others, comments line 1 through 8 and 15 through 18 did not make it over. Which become very apparent when you look at the deployment script.

    1:  PRINT N'Creating dbo.p_Comments...';
    2:  GO
    3:   
    4:  CREATE PROCEDURE [dbo].[p_Comments]
    5:  @param1 INT=0, @param2 INT
    6:  AS
    7:  BEGIN -- comment line 9
    8:      SET NOCOUNT ON -- comment line 10
    9:      -- comment line 11
   10:      SELECT @param1, @param2 -- comment line 12
   11:      -- comment line 13
   12:      RETURN 0 -- comment line 14
   13:  END
   14:  GO

The comments inside the source code are preserved, but they simply do not make it to the target.

The team is currently working on finding the appropriate resolution for this issue.

-GertD