TSQL divide por cero encontrado a pesar de que no hay columnas que contengan 0

He estado tratando de entender por qué obtengo una "división entre cero encontrada" (Mensaje 8134) con mi consulta SQL, pero me falta algo. Me gustaría saber lapor qu para el caso específico a continuación, soyn buscandoNULLIF, CASE WHEN... o similar como ya sé sobre ellos (y, por supuesto, puedo usarlos en una situación como la siguiente).

Tengo una instrucción SQL con una columna calculada similar a

SELECT
    TotalSize,
    FreeSpace,
    (FreeSpace / TotalSize * 100)
FROM
    tblComputer
...[ couple of joins ]...
WHERE
    SomeCondition = SomeValue

Ejecutar esta declaración de errores con los mensajes de error mencionados anteriormente, lo cual, en sí mismo, no es el problema, obviamenteTotalSize bien podría ser 0 y, por lo tanto, provocar el error.

hora, lo que no entiendo es que no tengo ninguna fila donde elTotalSize columna es 0 cuando comento la columna calculada, verifiqué que este no sea el caso.

Entonces pensé que, por alguna razón, el cálculo de la columna se realizaría en todo el conjunto de resultadosantes d en realidad se filtra con las condiciones de la cláusula where, pero esto a) no tendría sentido en mi humilde opinión yb) cuando se intenta reproducir el error con una configuración de prueba, todo funciona bien (ver más abajo):

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

Estoy bastante perplejo y me gustaría saber cuál es el motivo.

Cualquier idea o puntero en la dirección correcta es muy bienvenida, gracias de antemano

Actualiza

Gracias hasta ahora por su aporte, pero desafortunadamente parece que no me estoy acercando a la raíz del problema. Logré eliminar un poco la declaración y ahora tengo el caso de que puedo ejecutarla sin errores si se elimina un JOIN (lo necesitaría para columnas adicionales en la salida que eliminé temporalmente).

No entiendo, por qué el uso de JOIN conduce al error, ¿no debería un INNER JOIN estándar devolver el mismo número de filas o Meno, pero nunca?

Código de trabajo

SELECT 
TotalSize,
FreeSpace
((FreeSpace / TotalSize) * 100)
FROM 
MyTable1
INNER JOIN 
MyTable2 ON
MyTable1.ID = MyTable2.Table1ID
WHERE 
SomeCondition

Error que causa el código

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

También probé suerte usando un cursor y recorriendo el resultado fila por fila, pero en ese caso no se produjo ningún error (no importa cuál de las dos declaraciones anteriores intenté).

Perdón por la sangría de código desordenado, de alguna manera no parece aplicarse el formato correcto.

SOL

Respuestas a la pregunta(4)

Su respuesta a la pregunta