Ayuda con funcion

30/12/2005 - 17:46 por Matías | Informe spam
Hola a todos tengo que realizar una funcion(UDF) que devuelva V o F si el
select que pongo a continuacion devolvio 0 o 1 registro,
además la funcion debe recibir parámetros.

SELECT A.IDAlumno, B.[Fecha] AS FechaUltEstado
FROM Alumnos A
INNER JOIN AlumnosEstados B ON A.IdAlumno = B.IdAlumno
INNER JOIN Estados E ON B.IdEstado = E.IdEstado
WHERE B.[Fecha] = (SELECT MAX([Fecha]) FROM
AlumnosEstados D WHERE B.IdAlumno = D.IdAlumno AND B.IdAlumno @parametro1)
GROUP BY A.IDAlumno, B.[Fecha], E.IDestado
HAVING E.IDestado = @parametro2

Supongamos que la funcion se llama UdfMiFunc, entonces yo la utilizaría
desde los sp de la siguiente forma:

Select campo1, campo2
From MiTabla
Where UdfMiFunc(campo1, 15, 2) = T

Saludos y mil gracias

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
30/12/2005 - 20:18 | Informe spam
Matías,

Verdad que no me he detienido a pensar como hacer la función. Solo quiero
decirte que no es buena practica manipular las columnas que aparecen en la
clausula "where", de esta forma estas evitando que sql server haga un uso
adecuado de los indices, en caso de que existan.

Pudieras ser mas explicito en lo que deseas alcanzar o hacer?


AMB


"Matías" wrote:

Hola a todos tengo que realizar una funcion(UDF) que devuelva V o F si el
select que pongo a continuacion devolvio 0 o 1 registro,
además la funcion debe recibir parámetros.

SELECT A.IDAlumno, B.[Fecha] AS FechaUltEstado
FROM Alumnos A
INNER JOIN AlumnosEstados B ON A.IdAlumno = B.IdAlumno
INNER JOIN Estados E ON B.IdEstado = E.IdEstado
WHERE B.[Fecha] = (SELECT MAX([Fecha]) FROM
AlumnosEstados D WHERE B.IdAlumno = D.IdAlumno AND B.IdAlumno > @parametro1)
GROUP BY A.IDAlumno, B.[Fecha], E.IDestado
HAVING E.IDestado = @parametro2

Supongamos que la funcion se llama UdfMiFunc, entonces yo la utilizaría
desde los sp de la siguiente forma:

Select campo1, campo2
From MiTabla
Where UdfMiFunc(campo1, 15, 2) = T

Saludos y mil gracias



Respuesta Responder a este mensaje
#2 Matías
30/12/2005 - 20:51 | Informe spam
Ok, te comento, tengo una tabla(AlumnosEstados) donde voy guardando los
distintos estados de un alumno(inscripto, regular, libre, etc) y la fecha de
cada estado,
entonces en determinados select me hace falta traer los alumnos cuyo último
estado sea el que yo le paso como parámetro; el ultimo estado lo se por la
fecha,
es el select que indique al cual lo quiero poner en la funcion.
El tema es que son muchos select en los que tengo que esta mesclando este
select para traerme el ultimo estado, por eso yo lo quiero hacer en una
funcion.

SELECT A.IDAlumno, B.[Fecha] AS FechaUltEstado
FROM Alumnos A
INNER JOIN AlumnosEstados B ON A.IdAlumno = B.IdAlumno
INNER JOIN Estados E ON B.IdEstado = E.IdEstado
WHERE B.[Fecha] = (SELECT MAX([Fecha]) FROM
AlumnosEstados D WHERE B.IdAlumno = D.IdAlumno AND B.IdAlumno @parametro1)
GROUP BY A.IDAlumno, B.[Fecha], E.IDestado
HAVING E.IDestado = @parametro2

por ejemplo en este select q tengo q buscar alumunos por curso y estado:
SELECT
A.Apellidos+', '+ A.Nombres as ApellidoNombre, A.Legajo, A.IDAlumno,
A.IDSocio, A.NroDocumento, A.Curso, A.IDBonificacion, A.Sexo,
A.Domicilio, A.Piso, A.Dpto, A.LugarNacimiento, A.FechaNacimiento,
A.Telefono, A.E_mail, A.NroLibro, A.NroFolio, A.CertIngreso,
A.PadreMadreTutor AS PMoT,
A.IDBecario, B.[Fecha] AS FechaUltEstado, E.Descripcion AS Estado,
T.Descripcion AS TipoDoc, L.Descripcion AS Localidad, P.Descripcion AS Ciclo
FROM Alumnos A
INNER JOIN TipoDocumento T ON A.IDTipoDocumento = T.IDTipoDocumento
INNER JOIN Localidades L ON A.IDLocalidad = L.IDLocalidad
INNER JOIN AlumnosEstados B ON A.IdAlumno = B.IdAlumno
INNER JOIN Estados E ON B.IdEstado = E.IdEstado
INNER JOIN Curso C ON A.Curso = C.Curso
INNER JOIN CicloEnseñanza P ON P.IDCicloEnseñanza = C.IDCicloEnseñanza
WHERE B.[Fecha] = (SELECT MAX([Fecha]) FROM
AlumnosEstados D where B.IdAlumno = D.IdAlumno and A.Curso LIKE @Curso)
GROUP BY A.Apellidos, A.Nombres, A.Legajo, A.IDAlumno, A.IDSocio,
A.NroDocumento, A.Curso, A.IDBonificacion, A.Sexo,
A.Domicilio, A.Piso, A.Dpto, A.LugarNacimiento, A.FechaNacimiento,
A.Telefono, A.E_mail, A.NroLibro, A.NroFolio, A.CertIngreso,
A.PadreMadreTutor, A.IDBecario, B.[Fecha], E.Descripcion, T.Descripcion,
L.Descripcion, P.Descripcion, E.IdEstado
HAVING E.IdEstado = @IdEstado
ORDER BY ApellidoNombre

Gracias.
PD: no voy a poder ver tu respuesta hasta el lunes, ya me voy del trabajo y
en mi casa se me quemo el maldito modem.
Respuesta Responder a este mensaje
#3 Alejandro Mesa
30/12/2005 - 22:26 | Informe spam
Matías,

Entiendo mas o menos, porque me confunde la sgte mezcla:

WHERE B.[Fecha] = (SELECT MAX([Fecha]) FROM
AlumnosEstados D where B.IdAlumno = D.IdAlumno and A.Curso LIKE @Curso)



Por que A.Curso LIKE @Curso esta dentro de query correlacionado?

Pudieras crear una vista de la maxima fecha por alumno y estado, podiendola
usar en una union o join.


AMB

"Matías" wrote:

Ok, te comento, tengo una tabla(AlumnosEstados) donde voy guardando los
distintos estados de un alumno(inscripto, regular, libre, etc) y la fecha de
cada estado,
entonces en determinados select me hace falta traer los alumnos cuyo último
estado sea el que yo le paso como parámetro; el ultimo estado lo se por la
fecha,
es el select que indique al cual lo quiero poner en la funcion.
El tema es que son muchos select en los que tengo que esta mesclando este
select para traerme el ultimo estado, por eso yo lo quiero hacer en una
funcion.

SELECT A.IDAlumno, B.[Fecha] AS FechaUltEstado
FROM Alumnos A
INNER JOIN AlumnosEstados B ON A.IdAlumno = B.IdAlumno
INNER JOIN Estados E ON B.IdEstado = E.IdEstado
WHERE B.[Fecha] = (SELECT MAX([Fecha]) FROM
AlumnosEstados D WHERE B.IdAlumno = D.IdAlumno AND B.IdAlumno > @parametro1)
GROUP BY A.IDAlumno, B.[Fecha], E.IDestado
HAVING E.IDestado = @parametro2

por ejemplo en este select q tengo q buscar alumunos por curso y estado:
SELECT
A.Apellidos+', '+ A.Nombres as ApellidoNombre, A.Legajo, A.IDAlumno,
A.IDSocio, A.NroDocumento, A.Curso, A.IDBonificacion, A.Sexo,
A.Domicilio, A.Piso, A.Dpto, A.LugarNacimiento, A.FechaNacimiento,
A.Telefono, A.E_mail, A.NroLibro, A.NroFolio, A.CertIngreso,
A.PadreMadreTutor AS PMoT,
A.IDBecario, B.[Fecha] AS FechaUltEstado, E.Descripcion AS Estado,
T.Descripcion AS TipoDoc, L.Descripcion AS Localidad, P.Descripcion AS Ciclo
FROM Alumnos A
INNER JOIN TipoDocumento T ON A.IDTipoDocumento = T.IDTipoDocumento
INNER JOIN Localidades L ON A.IDLocalidad = L.IDLocalidad
INNER JOIN AlumnosEstados B ON A.IdAlumno = B.IdAlumno
INNER JOIN Estados E ON B.IdEstado = E.IdEstado
INNER JOIN Curso C ON A.Curso = C.Curso
INNER JOIN CicloEnseñanza P ON P.IDCicloEnseñanza = C.IDCicloEnseñanza
WHERE B.[Fecha] = (SELECT MAX([Fecha]) FROM
AlumnosEstados D where B.IdAlumno = D.IdAlumno and A.Curso LIKE @Curso)
GROUP BY A.Apellidos, A.Nombres, A.Legajo, A.IDAlumno, A.IDSocio,
A.NroDocumento, A.Curso, A.IDBonificacion, A.Sexo,
A.Domicilio, A.Piso, A.Dpto, A.LugarNacimiento, A.FechaNacimiento,
A.Telefono, A.E_mail, A.NroLibro, A.NroFolio, A.CertIngreso,
A.PadreMadreTutor, A.IDBecario, B.[Fecha], E.Descripcion, T.Descripcion,
L.Descripcion, P.Descripcion, E.IdEstado
HAVING E.IdEstado = @IdEstado
ORDER BY ApellidoNombre

Gracias.
PD: no voy a poder ver tu respuesta hasta el lunes, ya me voy del trabajo y
en mi casa se me quemo el maldito modem.



Respuesta Responder a este mensaje
#4 qwalgrande
31/12/2005 - 00:47 | Informe spam
Hola.

Creo que en esta ocasión puedes ahorrarte crear la función, utiliza la
función exists([consulta]), que devuelve si o no si la consulta devuelve
registros o no. Además es de lo más efectivo, ya que no tienes que devolver
un recorset ni nada, y a la que encuentre el motor un registro dejará de
procesar.

Tratando de adivinar, tu consulta sería algó así como:

select idalumno, Nombre, Apellidos
from Alumnos
where exists (select)

Alberto López Grande (qwalgrande)
"Matías" escribió en el mensaje
news:%
Hola a todos tengo que realizar una funcion(UDF) que devuelva V o F si el
select que pongo a continuacion devolvio 0 o 1 registro,
además la funcion debe recibir parámetros.

SELECT A.IDAlumno, B.[Fecha] AS FechaUltEstado
FROM Alumnos A
INNER JOIN AlumnosEstados B ON A.IdAlumno = B.IdAlumno
INNER JOIN Estados E ON B.IdEstado = E.IdEstado
WHERE B.[Fecha] = (SELECT MAX([Fecha]) FROM
AlumnosEstados D WHERE B.IdAlumno = D.IdAlumno AND B.IdAlumno > @parametro1)
GROUP BY A.IDAlumno, B.[Fecha], E.IDestado
HAVING E.IDestado = @parametro2

Supongamos que la funcion se llama UdfMiFunc, entonces yo la utilizaría
desde los sp de la siguiente forma:

Select campo1, campo2
From MiTabla
Where UdfMiFunc(campo1, 15, 2) = T

Saludos y mil gracias


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida