我一直在試圖理解爲什麼我用SQL查詢得到「除以零」(Msg 8134),但我必須缺少一些東西。我想想知道爲什麼下面的具體情況,我不尋找NULLIF
,CASE WHEN...
或類似的,因爲我已經知道他們(當然可以用他們在局勢下一個)。儘管沒有包含0的列,TSQL除以零
我有類似
SELECT
TotalSize,
FreeSpace,
(FreeSpace/TotalSize * 100)
FROM
tblComputer
...[ couple of joins ]...
WHERE
SomeCondition = SomeValue
運行與上面提到的錯誤消息,這,本身是沒有問題的這種說法的錯誤計算列的SQL語句 - 顯然TotalSize
很可能是0,因此導致錯誤。
現在我不明白的是,我沒有任何行TotalSize
列是0時,我評論計算列出來,我再次檢查,這是不是這種情況。
後來我想,由於某種原因列計算將在整個結果進行設定其實之前與where子句條件的過濾,但是這一個)是沒有意義恕我直言,和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.
謝謝您的解釋,它證實了我在過去幾天內開始假設的內容以及Lieven在上述評論中提出的建議。由於我只能選擇一個答案,而且他更多地參與了此案,所以我選擇了他的答案,但再次感謝您的幫助。 – Gorgsenegger 2011-03-08 08:12:22
+1。 @Gorgsenegger - SQLkiwi的回答很有用,也回答了我自己試圖強制優化器首先評估where子句的錯誤。我感謝您的信任投票,但您真的應該將* this *標記爲已接受的答案。 – 2011-03-08 08:19:29
@Lieven,好的,如果這對你來說沒有問題,謝謝不管怎麼說;-) – Gorgsenegger 2011-03-08 09:08:10