# "GetTopLevelMessages" 存储过程

说明：

本存储过程返回门户中指定的讨论模块中跟贴的第一个消息。输入参数是ModuleID和PortalID。

计算出的“ChildCount”域的值表明回应顶层帖子的帖子总数总数。如果该值大于一，表明讨论模块将该消息作为可扩展结点。

定义：

       CREATE PROCEDURE Portal_GetTopLevelMessages
       (
           @ModuleID int
       )
       AS

       SELECT
           ItemID,
           DisplayOrder,
           LEFT(DisplayOrder, 23) AS Parent,
           (SELECT COUNT(*) -1  FROM Portal_Discussion Disc2 WHERE LEFT(Disc2.DisplayOrder,LEN(RTRIM(Disc.DisplayOrder))) = Disc.DisplayOrder) AS ChildCount,
           Title,
           CreatedByUser,
           CreatedDate

       FROM Portal_Discussion Disc

       WHERE
           ModuleID=@ModuleID
         AND
           (LEN( DisplayOrder ) / 23 ) = 1

       ORDER BY
           DisplayOrder

使用到的数据表：

Discussion: 如讨论门户模块所示，Discussion表中的每条记录都是一个跟贴讨论区的消息。所有的讨论模块都将其记录存储在这个表中，所以每项记录包含一个ModuleID，以便一次查询就可以获得所有相关的项。

Discussion表的一个很有趣的特性是其DisplayOrder域，他是用于创建讨论中消息的线索显示。该域的值是通过将一个对当前日期和时间的23个字符串的描述值与其父项DisplayOrder域的值相连接得到的。通过这种方法，信息可以通过简单的升序排列按照正确的顺序显示。这种方法有一个内在的局限性，即DisplayOrder域的大小是有限的，在本例中是750字符。因此，当消息的嵌套超过32层时，就不能按照正确的顺序显示了。

Discussion表的主键是ItemID。注意：消息主体限于3000字符以内。