2011-11-25 50 views
1

出於某種原因,以下代碼正在返回結果,請勿按正確順序排列。SQL語句輸出錯誤順序,不知道爲什麼?

任何人有任何想法,爲什麼,因爲我一直在尋找它的幾個小時,還沒有發現這個問題:

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 

任何幫助,您可以提供將不勝感激。 非常感謝, 保羅

+1

您沒有指定任何ORDER BY,因此SQL Server不會重新排列任何數據排序的數據...如果您需要訂單,請指定'ORDER BY' –

回答

5

如果你想要一個特定的順序,你需要在你的SELECT語句中使用ORDER BY

由於您在SELECT語句中未指定ORDER BY,因此數據庫可以按照它喜歡的任何順序自由返回行。

編輯

我加入Lamak的評論,使這個答案完整:

row_number()的窗口定義的ORDER BY僅用於計算row_number()功能的結果。它不用於對整體結果進行排序(這是窗口函數之美的一部分)

要按計算出的row_number()進行排序,您需要將ORDER BY RowNum添加到最終的SELECT語句中。

+0

+1 - 無'ORDER BY'沒有訂單 - 就這麼簡單... –

+0

ORDER BY指定:SELECT ROW_NUMBER()OVER(ORDER BY a.CreateDate DESC)作爲RowNum ...我必須將它添加到其他地方..? – neojakey

+3

@neojakey - 'ORDER BY'僅用於計算'ROW_NUMBER',它並不排序返回的行。爲此,您需要在查詢結尾處添加一個「ORDER BY RowNum」 – Lamak

0

我相信你需要在最終的select語句中添加orderby,可能是由rownum命令?

相關問題