0

我正在使用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)獲得始終不正確的結果。

+0

你想要做什麼?那裏有很多數字表解決方案?它失敗了什麼值? – gbn 2011-03-06 08:48:05

+0

@gbn這開始作爲一個代碼高爾夫運動來創建一個數字序列。它完美的工作,除非我戲劇性地改變@n。但是,正如我所說的,我可以將查詢複製並粘貼到新窗口,並且我將得到100%正確的結果。所以在我看來,有一個錯誤不在我的查詢中。 – IamIC 2011-03-06 08:51:02

+0

它適用於我,因爲您沒有給出任何失敗的示例數字。我沒有得到的是將LOG和FLOOR用於Tally表格 – gbn 2011-03-06 08:53:08

回答

2

將ORDER BY添加到最後一條語句。

有任何表中的任何自然或默認順序

編輯:

我的屬性是使用浮點數

我張貼瞭如何做一個符合表一小時前的:Maximum recursion has been exhausted

+0

我試着把第一個選擇和溫度的ORDER BY。提到最後一個。它沒有幫助。對於@n = 655360,我得到以下結果:第4354行=> n = 4354;第4355行=> n = 133731。沒有意義。 – IamIC 2011-03-06 09:12:24

+0

我甚至試過這個,無濟於事:\t \t INSERT INTO @t(n)SELECT t。的n + @i FROM \t \t \t( \t \t \t \t \t SELECT TOP \t(100)%的N \t \t \t \t \t FROM \t @t \t \t \t \t ORDER BY \tÑ \t \t \t)AS噸; – IamIC 2011-03-06 09:16:17

+0

@gbn哦,你的意思是最後選擇。明白了。 – IamIC 2011-03-06 09:24:02