none
Error al intentar crear una funcion RRS feed

  • Pregunta

  • Saludos a todos, mi objetivo es crear una funcion que me devuelva como resultado un valor del tipo fecha, para el cual mi funcion necesita como parametro de ingreso un valor(@dniegre)

    En esta imagen se puede ver que tengo un conjunto de sentencias que deseo que vayan incluidas en mi funcion, previamente estas sentencias han sido probadas y al ser ejecutadas devuelven como resultado la fecha deseada.

    Pero al momento de incluirlas en la estructura de la funcion , me aparece el siguiente error : Las instrucciones SELECT incluidas en una función no pueden devolver datos a un cliente.

    Por lo tanto les pediria me ayuden o me indiquen en que forma puedo cambiar la estructura de la funcion para poder crearla y asi poder obtener el campo fecha deseado.

    jueves, 7 de febrero de 2019 16:11

Todas las respuestas

  • Una función DEVUELVE un valor, ¿Donde esta su RETURN?

    IIslas Master Consultant SQL Server

    jueves, 7 de febrero de 2019 16:37
  • Hola fredsale:

    Además de lo que ya te han comentado, tienes algunos agujeros en la creación de la función:

    Te voy a exponer una posible solución, aunque tienes que revisarla, porque yo lo he tratado contra el esquema por defecto, y tu trabajas dos esquemas. En mi escenario están los campos que mencionas pero no todos, y pueden ser un pelín diferentes, además, veo que ningún alumno puede llevar 3 años. o 6....et.

    CREATE TABLE tblAlumnoEgresado
    (idAlumno      INT, 
     fecEstadoAPEC DATETIME
    );
    GO
    CREATE TABLE dat_alumno
    (idAlumno INT, 
     dni      VARCHAR(15)
    );
    GO
    CREATE TABLE tblSeguimientoEgresado
    (id           INT, 
     dni          VARCHAR(15), 
     estaEncuaA0  INT, 
     estaEncuaA1  INT, 
     estaEncuaA3  INT, 
     estaEncuaA5  INT, 
     fechaEncuaA0 DATETIME, 
     fechaEncuaA1 DATETIME, 
     fechaEncuaA3 DATETIME, 
     fechaEncuaA5 DATETIME
    );
    GO
    INSERT INTO tblAlumnoEgresado
    (idAlumno, 
     fecEstadoAPEC
    )
    VALUES
    (1, 
     '20180125 17:21'
    );
    GO
    INSERT INTO dat_alumno
    (idAlumno, 
     dni
    )
    VALUES
    (1, 
     '71696048'
    );
    GO
    INSERT INTO tblSeguimientoEgresado
    (id, 
     dni, 
     estaEncuaA0, 
     estaEncuaA1, 
     estaEncuaA3, 
     estaEncuaA5, 
     fechaEncuaA0, 
     fechaEncuaA1, 
     fechaEncuaA3, 
     fechaEncuaA5
    )
    VALUES
    (1, 
     '71696048', 
     1, 
     1, 
     1, 
     1, 
     '20180125', 
     '20180126', 
     '20180127', 
     '20180128'
    );
      GO
    /* Fin del escenario */

    Sentencia de creación de función

    CREATE FUNCTION dbo.fnObtenerFechaActualizacionE
    (@dniegre VARCHAR(10)
    )
    RETURNS DATETIME
    AS
         BEGIN
             DECLARE @anioSegui SMALLINT;
             DECLARE @fechaEgre DATETIME;
             DECLARE @DNI VARCHAR(15)= @dniegre;
             IF(EXISTS
             (
                 SELECT *
                 FROM tblAlumnoEgresado t
                      INNER JOIN dat_alumno d ON t.idAlumno = d.idAlumno
                 WHERE d.dni = @dni
             ))
                 BEGIN
    
                     /*EVALUAMOS DIRECTAMENTE LOS AÑOS */
    
                     SELECT @anioSegui = CASE
                                             WHEN DATEDIFF(YEAR, T.fecEstadoAPEC, GETDATE()) > 5
                                             THEN 5
                                             WHEN DATEDIFF(YEAR, T.fecEstadoAPEC, GETDATE()) = 4
                                             THEN 3
                                             WHEN DATEDIFF(YEAR, T.fecEstadoAPEC, GETDATE()) = 2
                                             THEN 1
                                             ELSE DATEDIFF(YEAR, T.fecEstadoAPEC, GETDATE())
                                         END
                     FROM tblAlumnoEgresado T
                          INNER JOIN dat_alumno D ON T.idAlumno = D.idAlumno
                     WHERE D.dni = @dni;
             END;
             SELECT @fechaEgre = CASE @anioSegui
                                     WHEN 0
                                     THEN fechaEncuaA0
                                     WHEN 1
                                     THEN fechaEncuaA1
                                     WHEN 3
                                     THEN fechaEncuaA3
                                     WHEN 5
                                     THEN fechaEncuaA5
                                     ELSE '20190101'
    
                                 /* NO HAS CONTEMPLADO MÁS OPCIONES Y DEBERÍAS */
    
                                 END
             FROM tblSeguimientoEgresado
             WHERE CASE @anioSegui
                       WHEN 0
                       THEN estaEncuaA0
                       WHEN 1
                       THEN estaEncuaA1
                       WHEN 3
                       THEN estaEncuaA3
                       WHEN 5
                       THEN estaEncuaA5
                   END = 1
                   AND dni = @dni;
             RETURN @fechaEgre;
         END;

    Uno de los supuestos a retornar es un valor inicial ya que la función regresa una fecha, pero si no encuentra al dni ? O si como te comentaba, lleva 7 años.

    https://docs.microsoft.com/es-es/sql/t-sql/statements/create-function-transact-sql?view=sql-server-2017

    https://docs.microsoft.com/es-es/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017

    Espero te ayude

    jueves, 7 de febrero de 2019 20:53