Ayuda con Funcion (UDF)

22/06/2005 - 02:05 por Matías L | Informe spam
Hola a todos, tengo la siguiente función que me devuelve un solo registro:

CREATE FUNCTION udfCantAluEstado(@IdEstado smallint)
RETURNS TABLE
AS
RETURN (SELECT count(*) as Cant
FROM Alumnos A
INNER JOIN AlumnosEstados AE ON A.IdAlumno = AE.IdAlumno
INNER JOIN Estados E ON AE.IdEstado = E.IdEstado
WHERE AE.[Fecha] = (SELECT MAX([Fecha]) FROM
AlumnosEstados D WHERE AE.IdAlumno = D.IdAlumno) and E.IdEstado = @IdEstado
GROUP BY A.IdAlumno, E.IdEstado)

Y me hace falta ese valor (Cant) para usarlo desde distintos SPs, como este,
el tema es que no se como invocar el valor que me devuelve la función:

CREATE PROCEDURE pa_proceso_inicio_clases(@Fecha as datetime) AS
INSERT INTO ProcesosClases (IdProceso, Fecha, CantAlumReg)
VALUES (1, @Fecha, udfCantAluEstado(1))

o sea, como debo llamar a udfCantAluEstado para que me devuelva el valor y
poder insertarlo?
de la forma q estoy haciendo en el ejemplo no me funciona ya que me salta
que udfCantAluEstado no es un nombre de función reconocido.
Otra opcion, pero no se como hacerla, es que la funcion devuelva un tipo de
dato Int en lugar de una tabla.

Muchas Gracias
 

Leer las respuestas

#1 Alejandro Mesa
22/06/2005 - 13:59 | Informe spam
Matías L,

La udf retorna una tabla y por lo tanto no puedes usarla en una sentencia
tipo:

insert into ...
values(...)

para eso debes usar una sentencia tipo:

insert into ...
select ...
from ...

Ejemplo:

CREATE PROCEDURE pa_proceso_inicio_clases(
@Fecha as datetime
)
AS
set nocount on

INSERT INTO ProcesosClases (IdProceso, Fecha, CantAlumReg)
select 1, @Fecha, cant
from udfCantAluEstado(1)

return @@error
go

Yo recomendaria que la funcion sea tipo escalar en vez de devolver una tabla.

CREATE FUNCTION udfCantAluEstado(@IdEstado smallint)
RETURNS int
AS
begin
RETURN (SELECT count(*)
FROM Alumnos A
INNER JOIN AlumnosEstados AE ON A.IdAlumno = AE.IdAlumno
INNER JOIN Estados E ON AE.IdEstado = E.IdEstado
WHERE AE.[Fecha] = (SELECT MAX([Fecha]) FROM
AlumnosEstados D WHERE AE.IdAlumno = D.IdAlumno) and E.IdEstado = @IdEstado
GROUP BY A.IdAlumno, E.IdEstado)
end
go

ahora si puedes usar la funcion en una sentencia como la primera.

CREATE PROCEDURE pa_proceso_inicio_clases(@Fecha as datetime) AS
set nocount on

INSERT INTO ProcesosClases (IdProceso, Fecha, CantAlumReg)
VALUES (1, @Fecha, udfCantAluEstado(1))

return @@error
go


AMB

"Matías L" wrote:

Hola a todos, tengo la siguiente función que me devuelve un solo registro:

CREATE FUNCTION udfCantAluEstado(@IdEstado smallint)
RETURNS TABLE
AS
RETURN (SELECT count(*) as Cant
FROM Alumnos A
INNER JOIN AlumnosEstados AE ON A.IdAlumno = AE.IdAlumno
INNER JOIN Estados E ON AE.IdEstado = E.IdEstado
WHERE AE.[Fecha] = (SELECT MAX([Fecha]) FROM
AlumnosEstados D WHERE AE.IdAlumno = D.IdAlumno) and E.IdEstado = @IdEstado
GROUP BY A.IdAlumno, E.IdEstado)

Y me hace falta ese valor (Cant) para usarlo desde distintos SPs, como este,
el tema es que no se como invocar el valor que me devuelve la función:

CREATE PROCEDURE pa_proceso_inicio_clases(@Fecha as datetime) AS
INSERT INTO ProcesosClases (IdProceso, Fecha, CantAlumReg)
VALUES (1, @Fecha, udfCantAluEstado(1))

o sea, como debo llamar a udfCantAluEstado para que me devuelva el valor y
poder insertarlo?
de la forma q estoy haciendo en el ejemplo no me funciona ya que me salta
que udfCantAluEstado no es un nombre de función reconocido.
Otra opcion, pero no se como hacerla, es que la funcion devuelva un tipo de
dato Int en lugar de una tabla.

Muchas Gracias



Preguntas similares