Почему мои результаты не остаются последовательными? - PullRequest
2 голосов
/ 30 сентября 2010

У меня есть следующая хранимая процедура, над которой я работаю.Я заметил, что каждый пятый или шестой раз, когда я обновляю свои результаты, появляются новые значения.Что с учетом того, что данные находятся в статической среде, и никто не вносит никаких изменений в данные в настоящее время, я действительно не могу понять.Может кто-нибудь, пожалуйста, объясните мне, почему я вижу разные результаты, даже если я запускаю эту процедуру с точно такими же параметрами.Я даже попробовал это в анализаторе запросов и все еще вижу те же странные результаты.

Я работаю в Sql 2008.

Вот этот процесс:

ALTER PROCEDURE [dbo].[SelectSearchBy_Category]
    @userId     INT,
    @page       INT,
    @results        INT,
    @category       NVARCHAR(50),
    @searchTerm NVARCHAR(200) = NULL
AS
BEGIN

    SET NOCOUNT ON
    SET ROWCOUNT @results

    DECLARE @categoryId INT

    IF (@category IS NOT NULL) BEGIN
        SET @categoryId = ( SELECT categoryId FROM Category WHERE categoryDescription = @category )
    END

    DECLARE @rowEnd     INT
    DECLARE @rowStart   INT
    SET @rowEnd = (@page * @results)
    SET @rowStart = @rowEnd - @results

    ;WITH OrderedItems AS 
    (   
        SELECT
            i.itemId,
            title,
            i.[description],
            i.url,
            i.categoryId,
            i.ratingId,
            i.requirements,
            ISNULL(i.rating, 0) AS tating,
            ISNULL(i.raters, 0) AS raters,
            i.urlFriendlyPath,
            ROW_NUMBER() OVER
            (
                ORDER BY i.dateAdded, (ISNULL(i.rating, 0) * ISNULL(i.raters, 0))
            ) AS RowNumber
        FROM
            [dbo].[Item] i
        LEFT JOIN
            UserItemIgnore uii ON uii.itemId = i.itemId AND uii.userId = @userId
        INNER JOIN
            ItemLanguage il ON il.itemId = i.itemId
        WHERE
            (@searchTerm IS NULL OR a.title LIKE '%' + @searchTerm + '%') AND
            i.categoryId = @categoryId AND
            il.languageId = 1 AND
            uii.itemId IS NULL
    )

    SELECT *
    FROM OrderedItems
    WHERE RowNumber BETWEEN @rowStart AND @rowEnd

END

Ответы [ 2 ]

2 голосов
/ 30 сентября 2010

Вероятно, вы получите согласованные результаты, если вы добавите предложение order by в определение временной таблицы OrderedItems.

1 голос
/ 30 сентября 2010

Попробуйте использовать

 ROW_NUMBER() OVER (ORDER BY i.dateAdded, 
                             (ISNULL(i.rating, 0) * ISNULL(i.raters, 0)), 
                             i.itemId)

i.itemId, который будет действовать как прерыватель связи, чтобы гарантировать, что результаты ROW_NUMBER будут детерминированными, если у вас есть строки с равными рангами для i.dateAdded, (ISNULL(i.rating, 0) * ISNULL(i.raters, 0))

...