# "AddMessage" 存储过程

说明：

本存储过程为门户的某个特殊讨论模块在讨论区中添加一项新的消息。输入参数包括Title, Body, 以及跟贴用户的name项。输出参数是新数据记录的ItemId。

DisplayOrder域的值是通过将一个对当前时间的23个字符的描述值与其父项DisplayOrder域的值相连接得到的。

定义：

       CREATE PROCEDURE Portal_AddMessage
       (
           @ItemID int OUTPUT,
           @Title nvarchar(100),
           @Body nvarchar(3000),
           @ParentID int,
           @UserName nvarchar(100),
           @ModuleID int
       )

       AS

       /* Find DisplayOrder of parent item */
       DECLARE @ParentDisplayOrder as nvarchar(750)

       SET @ParentDisplayOrder = ""

       SELECT
           @ParentDisplayOrder = DisplayOrder
       FROM Portal_Discussion
       WHERE
           ItemID = @ParentID

       INSERT INTO Portal_Discussion
       (
           Title,
           Body,
           DisplayOrder,
           CreatedDate,
           CreatedByUser,
           ModuleID
       )

       VALUES
       (
           @Title,
           @Body,
           @ParentDisplayOrder + CONVERT( nvarchar(24), GetDate(), 21 ),
           GetDate(),
           @UserName,
           @ModuleID
       )

       SELECT
           @ItemID = @@Identity

使用到的数据库表：

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

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

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