# "GetThreadMessages" 存储过程

说明：

本存储过程返回由ItemID指定的顶层消息的全部子消息的统计数字。

在实现讨论区中的操作时，本存储过程设计里一种简易的方案，有助于讨论区模块描述消息的嵌套 。GetThread（消息）把HTML空格字符对每条消息嵌套层数的比值填入Indent域。讨论模块只需要在Title域之前提供Indent域的值，就可以创建出嵌套的视觉效果。

定义：

       CREATE PROCEDURE Portal_GetThreadMessages
       (
           @Parent nvarchar(750)
       )
       AS

       SELECT
           ItemID,
           DisplayOrder,
           REPLICATE( ' ', ( ( LEN( DisplayOrder ) / 23 ) - 1 ) * 5 ) AS Indent,
           Title,
           CreatedByUser,
           CreatedDate,
           Body

       FROM Portal_Discussion

       WHERE
           LEFT(DisplayOrder, 23) = @Parent
         AND
           (LEN( DisplayOrder ) / 23 ) > 1

       ORDER BY
           DisplayOrder

使用到的数据表：

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

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

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