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