SQL语句输出顺序不正确,不确定原因?

SQL语句输出顺序不正确,不确定原因?,sql,sql-server-2008,Sql,Sql Server 2008,由于某些原因,下面的代码返回的结果顺序不正确 任何人都知道为什么,因为我已经看了几个小时,还没有发现问题: USE [storeboard] GO /****** Object: StoredProcedure [sbuser].[sp_MemberMailList ] Script Date: 11/25/2011 12:04:15 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROC [sbuser].

由于某些原因,下面的代码返回的结果顺序不正确

任何人都知道为什么,因为我已经看了几个小时,还没有发现问题:

USE [storeboard]
GO
/****** Object:  StoredProcedure [sbuser].[sp_MemberMailList ]    Script Date: 11/25/2011 12:04:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [sbuser].[sp_MemberMailList ]
    @MemberMailID bigint = null,
    @FromMemberID bigint = null,
    @ToMemberID bigint = null,
    @Subject varchar(150) = null,
    @Message varchar(8000) = null,
    @FromDeletedFlag bit = null,
    @ToDeletedFlag bit = null,
    @FromArchivedFlag bit = null,
    @ToArchivedFlag bit = null,
    @ReadFlag bit = null,
    @SQL nvarchar(4000) = null,
    @SortField varchar(100) = null,
    @SortOrder varchar(25) = null,
    @NotificationSent bit = null,
    @MemberID bigint = null,
    @OnHold bit = 0,
    @SpecialMail varchar(1) = 'N',
    @PageSize float = null,
    @PageNum int = 1,
    @TotalPages float = null,
    @StartDate datetime = null,
    @EndDate datetime = null,
    @MODE varchar(50)

AS

IF @MODE = 'INBOX-MAIL-NOSORT'
    BEGIN
        SELECT @TotalPages = CEILING(COUNT(*)/@PageSize)
        FROM MemberMail
        WHERE ToMemberID = @ToMemberID
        AND ToDeletedFlag = 0
        AND OnHold = 0
        AND ToArchivedFlag = 0
        AND FromDeletedFlag = 0;

        WITH InMailsCDDESC AS
        (

            SELECT ROW_NUMBER() OVER(ORDER BY a.CreateDate DESC) AS RowNum,
            a.MemberMailID,     -- 1
            a.FromMemberID,     -- 2
            a.Subject,          -- 3
            a.CreateDate,       -- 4
            b.UserName,         -- 5
            a.ToReadFlag,       -- 6
            b.Firstname,        -- 7
            b.Lastname,         -- 8
            b.MemberDisplayName AS DisplayName, -- 9
            @TotalPages AS TotalPages -- 10
            FROM MemberMail a
            INNER JOIN Member b ON b.MemberID = a.FromMemberID
            WHERE a.ToMemberID = @ToMemberID
            AND a.ToDeletedFlag = 0
            AND a.OnHold = 0
            AND a.ToArchivedFlag = 0
            AND a.FromDeletedFlag = 0
        )
        SELECT * FROM InMailsCDDESC
        WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize
    END
如果您能提供任何帮助,我们将不胜感激。 非常感谢,,
Paul

如果您想要特定的订单,您需要在SELECT语句中使用
order BY

由于在SELECT语句中没有指定一个
ORDER BY
,因此数据库可以按照它喜欢的任何顺序自由返回行

编辑

我添加了拉马克的评论,以使这个答案完整:

row\u number()
窗口定义中的
ORDER BY
仅用于计算
row\u number()
函数的结果。它不用于对整体结果进行排序(这是窗口功能之美的一部分)


要按计算出的
行数()排序,需要在最终SELECT语句中添加
按行数排序。

如果需要特定的顺序,需要在SELECT语句中使用
按行排序

由于在SELECT语句中没有指定一个
ORDER BY
,因此数据库可以按照它喜欢的任何顺序自由返回行

编辑

我添加了拉马克的评论,以使这个答案完整:

row\u number()
窗口定义中的
ORDER BY
仅用于计算
row\u number()
函数的结果。它不用于对整体结果进行排序(这是窗口功能之美的一部分)


要按计算的
行数()排序,您需要在最终SELECT语句中添加
按行数排序。

我认为您需要在最终SELECT语句中添加orderby,可能是按行数排序?

我认为您需要在最终SELECT语句中添加orderby,可能按rownum排序?

您没有指定任何
排序-因此SQL Server不会重新生成按任何内容排序的数据。。。如果需要排序,请指定
排序依据
您不需要指定任何
排序依据
-这样SQL Server就不会按任何方式重新排序数据。。。如果需要订单,请指定
order BY
order BY is specified:SELECT ROW_NUMBER()OVER(order BY a.CreateDate DESC)AS RowNum。。。我必须将其添加到其他地方吗?@neojakey-该
ORDER BY
仅用于计算
行数,它不会对返回的行排序。为此,您需要在查询的末尾添加一个
orderbyrownum
指定的排序依据:选择RowNum()OVER(orderbya.createdatedesc)作为RowNum。。。我必须将其添加到其他地方吗?@neojakey-该
ORDER BY
仅用于计算
行数,它不会对返回的行排序。为此,您需要在查询末尾添加一个按RowNum排序的
ORDER