# "GetNextMessageId" 存储过程

说明：

本存储过程在GetSingleMessage存储程序中执行，并返回讨论区中下一条消息的ID。

定义：

       CREATE PROCEDURE Portal_GetNextMessageID
       (
           @ItemID int,
           @NextID int OUTPUT
       )
       AS

       DECLARE @CurrentDisplayOrder as nvarchar(750)
       DECLARE @CurrentModule as int

       /* Find DisplayOrder of current item */
       SELECT
           @CurrentDisplayOrder = DisplayOrder,
           @CurrentModule = ModuleID
       FROM Portal_Discussion
       WHERE
           ItemID = @ItemID

       /* Get the next message in the same module */
       SELECT Top 1
           @NextID = ItemID

       FROM Portal_Discussion

       WHERE
           DisplayOrder > @CurrentDisplayOrder
           AND
           ModuleID = @CurrentModule

       ORDER BY
           DisplayOrder ASC

       /* end of this thread? */
       IF @@Rowcount < 1
           SET @NextID = null

使用到的数据表：

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

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

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