我正在使用SQL Server 2008 R2快速版。SQL Server中的不穩定查詢
我寫了如下所示的查詢來生成從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,向下滾動說行169770。我得到行169770 = 40000.在新窗口中,它正確運行。
EDIT2
除了獲取隨機正確/不正確的結果,似乎別的東西是錯誤的。我現在正在爲一些數字(如655360)獲得始終不正確的結果。
你想要做什麼?那裏有很多數字表解決方案?它失敗了什麼值? – gbn 2011-03-06 08:48:05
@gbn這開始作爲一個代碼高爾夫運動來創建一個數字序列。它完美的工作,除非我戲劇性地改變@n。但是,正如我所說的,我可以將查詢複製並粘貼到新窗口,並且我將得到100%正確的結果。所以在我看來,有一個錯誤不在我的查詢中。 – IamIC 2011-03-06 08:51:02
它適用於我,因爲您沒有給出任何失敗的示例數字。我沒有得到的是將LOG和FLOOR用於Tally表格 – gbn 2011-03-06 08:53:08