Вывод оператора SQL в неправильном порядке, не знаете почему? - PullRequest
1 голос
/ 25 ноября 2011

По какой-то причине приведенный ниже код возвращает результаты, не в том порядкеПроблема:

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

Любая помощь, которую вы можете предоставить, будет принята с благодарностью.Большое спасибо, Пол

Ответы [ 2 ]

5 голосов
/ 25 ноября 2011

Если вы хотите определенный заказ, вам нужно использовать ORDER BY в вашем операторе SELECT.

Поскольку вы не указываете ORDER BY в своем операторе SELECT, база данных может возвращать строки в любом порядке.

Редактировать

Я добавляю комментарий Ламака, чтобы завершить этот ответ:

ORDER BY в определении окна для row_number() используется только для вычисления результата row_number()функция.Он не используется для сортировки общего результата (который является частью красоты оконных функций)

Чтобы упорядочить по вычисленному row_number(), необходимо добавить ORDER BY RowNum к окончательному оператору SELECT.

0 голосов
/ 25 ноября 2011

Полагаю, вам нужно добавить порядок в окончательном утверждении, возможно, порядок по rownum?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...