Не уверен, как я пропустил это в моем первом чтении. Другой ответ в значительной степени покрывает это - это зависит от плана выполнения, сгенерированного во время выполнения. Я просто столкнулся с этим, где я пропустил выполнение этого в одном из моих представлений - долгое время, но кто-то наконец-то придумал запрос, который изменил план настолько, чтобы вызвать ошибку.

ался понять, почему я получаю «деление на ноль» (Msg 8134) с моим запросом SQL, но я должен что-то упустить. Я хотел бы знатьПочему для конкретного случая ниже, яне находясь в поиске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) при попытке воспроизвести ошибку с тестовой настройкой все работает нормально (см. ниже):

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

Я также попытал счастья, используя курсор и циклически перебирая результирующий ряд за строкой, но в этом случае ошибки не возникало (независимо от того, какое из двух утверждений выше я пытался)

Извините за грязный отступ кода, так или иначе правильное форматирование, кажется, не применяется.

ГРАММ.

Ответы на вопрос(4)

Ваш ответ на вопрос