我正在使用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