我一直在尝试理解为什么我的SQL查询会出现“除以零遇到”(Msg 8134)的错误,但我可能漏掉了某些东西。对于下面特定的情况,我想知道为什么会出现这种情况,我不需要使用NULLIF
、CASE WHEN...
或类似的方法,因为我已经知道它们(当然可以在像下面这种情况下使用它们)。
我有一个类似的计算列的SQL语句:
SELECT
TotalSize,
FreeSpace,
(FreeSpace / TotalSize * 100)
FROM
tblComputer
...[ couple of joins ]...
WHERE
SomeCondition = SomeValue
运行此语句会出现上述错误消息,这本身并不是问题 - 显然 TotalSize
可能为0,从而导致了错误。
我不明白的是,当我注释掉计算列时,我没有任何 TotalSize
列为0的行,我再次确认这不是问题所在。
然后我想,由于某种原因,在实际筛选 where 子句条件之前,整个结果集可能会执行列计算,但是这样做 a) 在我看来不合理,b) 当尝试使用测试设置复制错误时,一切正常(见下文):
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0001',1)
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0002',1)
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0003',1)
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0004',0)
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0005',1)
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0006',0)
INSERT INTO tblComputer (ComputerName, IsServer) VALUES ('PC0007',1)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (1,100,21)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (2,100,10)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (3,100,55)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (4,0,10)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (5,100,23)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (6,100,18)
INSERT INTO tblHDD (ComputerID, TotalSize, FreeSpace) VALUES (7,100,11)
-- This statement does not throw an error as apparently the row for ComputerID 4
-- is filtered out before computing the (FreeSpace / TotalSize * 100)
SELECT
TotalSize,
FreeSpace,
(FreeSpace / TotalSize * 100)
FROM
tblComputer
JOIN
tblHDD ON
tblComputer.ID = tblHDD.ComputerID
WHERE
IsServer = 1
我很困惑,想知道原因。
欢迎任何想法或指导方向,先行致谢。
更新
非常感谢您的输入,但不幸的是,我似乎并没有接近问题的根源。 我设法将语句简化了一点,现在如果删除一个JOIN(我需要它来获取输出中的其他列,在此临时删除),则可以执行该语句而不会出错。
我不明白为什么使用JOIN会导致错误,标准的INNER JOIN是否始终会返回相同数量的行或更少,但从不会返回更多的行?
正常工作的代码:
SELECT
TotalSize,
FreeSpace
((FreeSpace / TotalSize) * 100)
FROM
MyTable1
INNER JOIN
MyTable2 ON
MyTable1.ID = MyTable2.Table1ID
WHERE
SomeCondition
引起错误的代码
SELECT
TotalSize,
FreeSpace
((FreeSpace / TotalSize) * 100)
FROM
MyTable1
INNER JOIN
MyTable2 ON
MyTable1.ID = MyTable2.Table1ID
-- This JOIN causes "divide by zero encountered" error
INNER JOIN
MyTable3 ON
MyTable2.ID = MyTable3.Table2ID
WHERE
SomeCondition
我还尝试使用游标并逐行循环遍历结果,但在这种情况下不会发生任何错误(无论我尝试哪个上述语句)。
对于代码缩进混乱的问题感到抱歉,某些原因导致正确的格式未能应用。
G.