Нестабильный запрос в SQL Server - PullRequest
0 голосов
/ 06 марта 2011

Я использую 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.

1 Ответ

2 голосов
/ 06 марта 2011

Добавьте ORDER BY к последнему утверждению.

Ни в одной таблице нет естественного порядка или порядка по умолчанию

Edit:

Я приписываю это использованию чисел с плавающей точкой

Я писал о том, как создать таблицу подсчета, час назад: Максимальная рекурсия исчерпана

...