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.itemIdROW_NUMBERランクが等しい行がある場合に、の結果が決定論的であることを確認するためのタイ ブレーカーとして機能します。i.dateAdded, (ISNULL(i.rating, 0) * ISNULL(i.raters, 0))

于 2010-09-29T23:48:42.063 に答える