2

我有以下正在处理的存储过程。我注意到,每 5 次或 6 次刷新结果时,都会有新的值出现。考虑到数据处于静态环境中,此时没有人对数据进行任何更改,我真的无法理解。有人可以告诉我为什么我会看到不同的结果,即使我使用完全相同的参数运行此过程。我什至在查询分析器中尝试过,仍然看到同样奇怪的结果。

我在 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
4

2 回答 2

2

如果您在临时表定义中放置一个order by子句,您可能会得到一致的结果。OrderedItems

于 2010-09-29T23:49:35.557 回答
1

尝试使用

 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))

于 2010-09-29T23:48:42.063 回答