0

SQL Server 2008-R2 Express Edition を使用しています。

以下に示すクエリを作成して、1 から @n までの数列を生成しました。(純粋にクエリ ウィンドウで) テストしたところ、@n の値を大幅に変更すると、誤った結果が得られることがわかりました。再実行しても同じエラーが発生します。ただし、新しいクエリ ウィンドウを開くと、結果は完璧です。

アルゴリズムを見ると、なぜ不安定な結果が得られるべきなのか (あるいは、クエリが固定入力に対してさまざまな結果を生成する可能性があるのか​​) について、私には意味がありません。

DECLARE @n INT;

SET @n = 65536;

DECLARE @t TABLE (n INT NOT NULL PRIMARY KEY);

IF @n > 0 BEGIN
    DECLARE @r INT, @i INT, @l INT;

    SET @r = FLOOR(1.442695040888964 * LOG(@n));
    SET @i = 1;
    SET @l = 0;

    INSERT INTO @t (n) VALUES (1);

    WHILE @l < @r BEGIN
        INSERT INTO @t (n) SELECT n + @i FROM @t;

        SET @i = @i * 2;
        SET @l = @l + 1;
    END;

    INSERT INTO @t (n) SELECT TOP (@n - @i) n + @i FROM @t;
END;

--SELECT COUNT(1) FROM @t;

select * from @t

編集

65536 を 5000 に変更し、実行して 65536 に戻し、169,770 行までスクロールします。行 169770 = 40000 が表示されます。新しいウィンドウでは、正しく実行されます。

EDIT2

ランダムに正しい/間違った結果が得られることに加えて、何か他のものが間違っているようです。655360 などの一部の数値について、一貫して誤った結果が得られるようになりました。

4

1 に答える 1

2

最後のステートメントに ORDER BY を追加します。

どのテーブルにも自然な順序やデフォルトの順序はありません

編集:

私はそれを浮動小数点数の使用に帰します

集計表の作成方法を 1 時間前に投稿しました:最大再帰が使い果たされました

于 2011-03-06T09:10:02.877 に答える