我一直试图理解为什么我的 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) 没有意义 imho 和 b) 在尝试使用 a 重现错误时测试设置一切正常(见下文):
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。