# "GetSingleMessage" 存储过程

说明：

本存储过程在数据库中返回单条消息记录。输入参数为ItemId，即该记录的主键。返回的信息包括消息细节，以及创建和最后编辑该记录的用户信息。GetSingleMessage执行两个存储过程：GetNextMessageId 和GetPrevMessageId。这两个存储过程的执行结果通过消息信息返回。

本存储过程由讨论区的编辑页面调用。

定义：

       CREATE PROCEDURE Portal_GetSingleMessage
       (
           @ItemID int
       )
       AS

       DECLARE @nextMessageID int
       EXECUTE Portal_GetNextMessageID @ItemID, @nextMessageID OUTPUT
       DECLARE @prevMessageID int
       EXECUTE Portal_GetPrevMessageID @ItemID, @prevMessageID OUTPUT

       SELECT
           ItemID,
           Title,
           CreatedByUser,
           CreatedDate,
           Body,
           DisplayOrder,
           NextMessageID = @nextMessageID,
           PrevMessageID = @prevMessageID

       FROM Portal_Discussion

       WHERE
           ItemID = @ItemID

使用到的数据表：

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

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

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