For some reason the code below is returning the results, put not in the correct order.
Anyone have any ideas why as I have been looking at it for a couple of hours and have yet to spot the problem:
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
Any help you can provide would be greatly appreciated.
Many thanks,
Paul
If you want a specific order you need to use an
ORDER BYin your SELECT statement.As you don’t specify an
ORDER BYin your SELECT statement, the database is free to return the rows in any order it likes.Edit
I’m adding Lamak’s comment to make this answer complete:
The
ORDER BYin the definition of the window forrow_number()is only used to to calculate result of therow_number()function. It is not used to sort the overall result (which is part of the beauty of windowing functions)To order by the calculated
row_number()you need to add anORDER BY RowNumto the final SELECT statement.