Disculpas si esto no es adecuado, pero en realidad se trata de un 'por qué' en lugar de un 'cómo'. No estoy seguro de que sea adecuado, pero no conozco un lugar mejor para preguntar y no puedo pensar cómo expresar un google para obtener lo que estoy buscando.Evaluación SQL de las cláusulas IF
IF 'hell' = 'freezing over'
BEGIN
SELECT log(0)
END
Mire esa afirmación. No hay mundo en el que la cláusula IF sea verdadera. Si intento ejecutarlo, estoy esperando que SQL salte la cláusula IF y se mueva hasta el final. En su lugar obtengo:
An invalid floating point operation occurred.
Esto es extraño. Así que supongo que esa es la forma en que SQL lo hace. Excepto ...
IF 'hell' = 'freezing over'
BEGIN
SELECT 1/0
END
No hay ningún error aquí. La declaración en la cláusula IF aún debe generar un error. ¿Alguien podría explicar por qué esto no está sucediendo?
Esto surgió mientras se depuraba un conjunto masivo de calcos SQL donde EXP (SUM (LOG())) se usa para acumular datos dentro de una cláusula if. Puedo alterar el código para evitar que vuelva a suceder, pero ¿por qué está evaluando algo dentro de una cláusula IF que no se cumple?
Saludos.
EDITAR: Diversión adicional. ¿Trata de atraparlo? Pffft
IF 1=2
BEGIN
BEGIN TRY
SELECT SQRT(-1)
END TRY
BEGIN CATCH
END CATCH
END
no matemática:
IF 1=2
BEGIN
SELECT SUBSTRING('hello',-1,-1)
END
Las advertencias de ANSI no hicieron ninguna diferencia, pero ese es el enlace que creo que necesitaba, así que muchas gracias :) –
Su bienvenida. Por ANSI_WARNINGS quise decir que si se emitiera un "set ansi_warnings off" en cualquier momento, entonces no vería un error de división por cero. Como el compilador nunca puede saber de antemano el estado del indicador ANSI_WARNINGS cuando se ejecuta la consulta compilada, debe ignorar cualquier expresión plegada que genere una excepción de divide por cero en el momento de la compilación, ya que no puede predecir el comportamiento deseado. (Si se garantiza que ansi_warnings siempre estará desactivado, 1/0 se doblaría a NULL) –