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

Preguntas similare

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



Respuesta Responder a este mensaje
#2 Matías
22/06/2005 - 15:25 | Informe spam
Muchas gracias por tu tiempo, lo voy a probar.

"Alejandro Mesa" escribió en el
mensaje news:
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
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida