Error al ejecutar un IIf SQL Server

Estoy realizando un IIf sencillo Sql Server y me da error en unas ocasiones por el signo de comparación y en otras por el paréntesis de cierre.

Esta sentencia genera este error: Msg 102, Level 15, State 1, Line 39 Incorrect syntax near ')'

El campo F08HIN contiene horas con formato 24 horas y los minutos que van desde 0 a 60 unidos por un punto. Ejemplo:

F08HIN =1.12

F08HIN =14.00

F08HIN =21.23

SELECT F08ART,
         IIf([F08HIN]>=6 And [F08HIN]<13.59, 1) AS T

FROM [V9].[F25AS401].[BUSRCDFN].[FIJ08L05]

La sentencia que completa que querría ejecutar la agrego debajo. En ACCESS funciona perfectamente. Al pasarla en SQL Server me da errores

SELECT F08ART,
      Left(IIf([F08HIN]>=6 And [F08HIN]<13.59,1) & IIf([F08HIN]>=14 And [F08HIN]<21.59,2) & 3,1)

      AS turno

FROM [V9].[F25AS401].[BUSRCDFN].[FIJ08L05]

Respuesta
2

Si lo pones exactamente así en Access dudo mucho que te funcione...

Y simplemente no te funcionará porque la función IIF (en Access y SQLServer), tiene tres argumentos: una expresión lógica, un valor verdadero y un valor falso, es decir, tiene una comparación entre valores, lo que se mostrará si esa comparación es verdadera, y lo que se mostrará si la comparación es falsa.

https://docs.microsoft.com/es-es/sql/t-sql/functions/logical-functions-iif-transact-sql?view=sql-server-ver15 

https://support.office.com/en-us/article/iif-function-32436ecf-c629-48a3-9900-647539c764e3 

Aquí:  IIf([F08HIN]>=6 And [F08HIN]<13.59, 1)

Solo tienes dos argumentos, la comparación ([F08HIN]>=6 And [F08HIN]<13.59) y el valor si es verdadero (1), pero te falta el valor si es falso...

Muchas gracias Sveinbjorn El Rojo,  según he entendido las versiones nuevas de SQL Server no reconocen el IIf. Me sorprende mucho porque el IIf es muy utilizado en muchos lenguajes de programación.

¡Atónito me dejas! Mira que llevo años usando Access y siempre que usé el IIF le ponía los tres argumentos. Y vista tu respuesto, acabo de hacer la prueba en un Access 2016, y veo que tal como lo tenías (con solo dos argumentos) funciona correctamente... Acabo de aprender algo nuevo...

La opción del CASE la conocía, pero como aún me manejo con SQLServer 2014, era mi segunda opción de respuesta...

Por cierto, que si en SQL Server (no sé si tu usas una versión superior) pones:

SELECT IIf([F08HIN]>=6 And [F08HIN]<13.59, 1,2) AS T

FROM dbo. Tabla

Funciona perfectamente, pero estás obligado a poner los 3 argumentos

1 respuesta más de otro experto

Respuesta
1

Googleando creo haber entendido que el IIF(...) tal y como se usaba en SQL Server no se usa en nuevas versiones y se ha cambiado por

CASE WHEN  "Sintaxis " THEN

     "afirmativo"

ELSE

    "negativa"

END AS NombreCampo

En mi caso sería:

case

       when [F08HIN]>=6 And [F08HIN] < 13.59 then      1

end as d

https://stackoverflow.com/questions/12035062/iif-not-a-recognized-built-in-function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas