none
Funcion T-SQL que devuelve una tabla. ¿No puede tener IF? RRS feed

  • Pregunta

  • Buenos días.

    Estoy aprendiendo a utilizar las funciones de SQL Server que devuelven una tabla.

    Intento simplemente hacer un IF en función de un valor que paso como parámetro y la función me marca error.

    ¿No se puede hacer?. 

    Debería utilizar ¿multi-statement table-valued function?

        CREATE FUNCTION funcExamenesNotas (@QueIdClase varchar(15))
        RETURNS TABLE 
        AS
        RETURN 
        (
    	   IF (@QueIdClase = '')    	  
    		  SELECT [IdAlumno] ,[IdClase],[XRepetidor],[XBajaAlumno]
    		    FROM [dbo].[AlumnosEnClases]
    	   ELSE		  
    		  SELECT [IdAlumno] ,[IdClase],[XRepetidor],[XBajaAlumno]
    		    FROM [dbo].[AlumnosEnClases]
    		  WHERE Examenes.IdClase = @QueIdClase
        )

    Este ejemplo lo único que haces es que si tengo un parámetro con valor '' devuelve todos los registros y si no, devuelve sólo los del parámetro.

    ----------------

    ¿Y tengo otra pregunta. Son realmente interesantes las funciones que devuelven tablas?

    Si utilizo una vista con un Where podría tener básicamente el mismo resultado.

    Un saludo y gracias por todo

    martes, 3 de octubre de 2017 7:19

Respuestas

  • Si quieres tener un "IF", pasa a ser un multi-statement, lo cual implica que no puedes poner "returns table", hay que definir la tabla, y tambien implica que el optimizador de consultas no puede optimizar la funcion conjuntamente con su llamante.

    Es mejor que la reescribas asi en lugar de usar el IF:

        CREATE FUNCTION funcExamenesNotas (@QueIdClase varchar(15))
        RETURNS TABLE 
        AS
        RETURN 
        (
       SELECT [IdAlumno] ,[IdClase],[XRepetidor],[XBajaAlumno]
    		    FROM [dbo].[AlumnosEnClases]
    		  WHERE (Examenes.IdClase = @QueIdClase) OR (@QueIdClase = '')
        )

    • Marcado como respuesta javiteran martes, 3 de octubre de 2017 7:42
    martes, 3 de octubre de 2017 7:28

Todas las respuestas

  • Si quieres tener un "IF", pasa a ser un multi-statement, lo cual implica que no puedes poner "returns table", hay que definir la tabla, y tambien implica que el optimizador de consultas no puede optimizar la funcion conjuntamente con su llamante.

    Es mejor que la reescribas asi en lugar de usar el IF:

        CREATE FUNCTION funcExamenesNotas (@QueIdClase varchar(15))
        RETURNS TABLE 
        AS
        RETURN 
        (
       SELECT [IdAlumno] ,[IdClase],[XRepetidor],[XBajaAlumno]
    		    FROM [dbo].[AlumnosEnClases]
    		  WHERE (Examenes.IdClase = @QueIdClase) OR (@QueIdClase = '')
        )

    • Marcado como respuesta javiteran martes, 3 de octubre de 2017 7:42
    martes, 3 de octubre de 2017 7:28
  • Muchas gracias.

    Me ha quedado claro.

    Y ya que estamos lo intentaré hacer también con la función multi-statement y así aprendo otra manera.

    Lo dicho, gracias.

    martes, 3 de octubre de 2017 7:43