Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

2 Store Procedures o usar Cursor¿?

Estas en el tema de 2 Store Procedures o usar Cursor¿? en el foro de SQL Server en Foros del Web. Buenas tengo una complicacion a la hora de crear una consulta en un SP, ya que uno de los campos profesion (tabla Profesion) se obtiene ...
  #1 (permalink)  
Antiguo 15/04/2009, 12:13
 
Fecha de Ingreso: octubre-2008
Mensajes: 51
Antigüedad: 15 años, 6 meses
Puntos: 0
2 Store Procedures o usar Cursor¿?

Buenas tengo una complicacion a la hora de crear una consulta en un SP, ya que uno de los campos profesion (tabla Profesion) se obtiene a partir de otra tabla la cual me trae mas de un dato en ese campo, por ende, al devolverme los datos este encuentra un error el cual una subconsutla trae mas de un dato.

El SP es este:

CREATE PROCEDURE beneficiado_listarAtencionUsuarioFecha
@usuario char(20),
@desde datetime,
@hasta datetime

AS
SELECT
beneficiado.fecha,
beneficiado.horaIngreso,
beneficiado.rut,beneficiado.usuario,
intranet.dbo.profesion.nombre as profesionNombre,
intranet.dbo.logueo.nombre as usuarioNombre,
intranet.dbo.logueo.apellido as usuarioApellido,
intranet.dbo.contribuyente.nombre as Nombre, intranet.dbo.contribuyente.apellido as apellido,
intranet.dbo.contribuyente.telefono as telefono,
intranet.dbo.contribuyente.celularCod as celularCod,
intranet.dbo.contribuyente.celular as celular

from beneficiado
Left Outer Join intranet.dbo.contribuyente on intranet.dbo.contribuyente.rut = beneficiado.rut

Left Outer Join intranet.dbo.logueo on intranet.dbo.logueo.iid = beneficiado.usuario


Left Outer Join intranet.dbo.profesion on intranet.dbo.profesion.ID = (select profesion from beneficiadoProfesion where usuario = @usuario AND fechaIngreso >= @desde AND fechaIngreso<= @hasta ) (*aqui devuelve mas de un valor)

WHERE beneficiado.usuario = @usuario
AND beneficiado.fecha >= @desde AND beneficiado.fecha<= @hasta
ORDER BY beneficiado.fecha
GO


Y mi consulta es que es mejor a nivel de rendimiento, etc, un Cursor para traer ese dato o todos los datos(miles) o 2 SP uno sin el campo profesion y otro que solo me traiga la profesion o concatenar esas profeciones y traerlas en un solo campo.

Si tienen otra idea de como hacer la consulta los esucho.

Saludos.

Última edición por calinzt; 15/04/2009 a las 15:01 Razón: Faltaba un campo
  #2 (permalink)  
Antiguo 15/04/2009, 14:43
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: 2 Store Procedures o usar Cursor¿?

Como se relaciona intranet.dbo.profesion con beneficiado?
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 15/04/2009, 15:04
 
Fecha de Ingreso: octubre-2008
Mensajes: 51
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: 2 Store Procedures o usar Cursor¿?

Cita:
Iniciado por flaviovich Ver Mensaje
Como se relaciona intranet.dbo.profesion con beneficiado?
Gracias por darte cuenta, se me olvido agregar el campo profesionNombre de intranet.dbo.profesion.

No hay relacion directa sino que se relaciona con beneficiadoProfesion el cual guarda una o mas profesiones que puede tener el beneficiado (tabla beneficiado) que es en este caso un numero el cual va a buscar su significado o nombre a intranet.dbo.profesion
  #4 (permalink)  
Antiguo 15/04/2009, 15:25
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: 2 Store Procedures o usar Cursor¿?

Prueba asi:
Código sql:
Ver original
  1. CREATE PROCEDURE beneficiado_listarAtencionUsuarioFecha
  2. @usuario CHAR(20),
  3. @desde datetime,
  4. @hasta datetime
  5.  
  6. AS
  7.  
  8. SELECT b.fecha, b.horaIngreso, b.rut, b.usuario, l.nombre AS usuarioNombre,
  9.     l.apellido AS usuarioApellido, c.nombre AS Nombre, c.apellido AS apellido,
  10.     c.telefono AS telefono, c.celularCod AS celularCod, c.celular AS celular
  11. FROM beneficiado b
  12.     LEFT OUTER JOIN intranet.dbo.contribuyente c ON c.rut = b.rut
  13.     LEFT OUTER JOIN intranet.dbo.logueo l ON l.iid = b.usuario
  14.     LEFT OUTER JOIN intranet.dbo.profesion p ON p.ID = b.xxx
  15.     LEFT OUTER JOIN beneficiadoProfesion bp ON bp.profesion= p.profesionNombre
  16. WHERE b.usuario = @usuario
  17.     AND b.fecha >= @desde AND b.fecha<= @hasta
  18. ORDER BY b.fecha
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #5 (permalink)  
Antiguo 15/04/2009, 15:35
 
Fecha de Ingreso: octubre-2008
Mensajes: 51
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: 2 Store Procedures o usar Cursor¿?

la tabla beneficiado no contiene los id de profesion si no que estan en la tabla profesion
y de intranet.dbo.profesion obtengo el nombre de la profesion
  #6 (permalink)  
Antiguo 15/04/2009, 15:48
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: 2 Store Procedures o usar Cursor¿?

Bueno, yo no conozco la relacion entre tus tablas, por eso tu tarea es adaptar el codigo que te he puesto.
Lo importante era mostrarte que si es posible relacionar todas las tablas.
Suerte!
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #7 (permalink)  
Antiguo 16/04/2009, 06:53
 
Fecha de Ingreso: octubre-2008
Mensajes: 51
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: 2 Store Procedures o usar Cursor¿?

100% de acuerdo con lo que dices de adaptar el codigo que das a mis necesidades pero el campo que yo preguntaba como trabajarlo trae mas de un dato y la forma de ejemplo que me has dado no se puede adaptar a lo que busco.

Gracias por la ayuda, tu ejemplo me sirvio para otro caso que tenia dudas ^^.
  #8 (permalink)  
Antiguo 16/04/2009, 09:00
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: 2 Store Procedures o usar Cursor¿?

Explica la relacion entre tablas y sus columnas.
Coloca una muestra de tus datos de las tablas en cuestion.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #9 (permalink)  
Antiguo 16/04/2009, 11:28
 
Fecha de Ingreso: octubre-2008
Mensajes: 51
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: 2 Store Procedures o usar Cursor¿?



Hola la relacion es la siguiente:

yo le envio el rut y de esa forma obtiene los "id" de las profesiones de esa persona y despues compara el id con el guardo en intranet.dbo.profesion.

El dilema es que al comparar hay mas de una profesion y me devuelve que la subconsulta trae mas de algun valor, entonces me pregunto que es mejor para resolver ese tema hacer 2 sp uno q me traiga todos los datos sin su profesion y otro que por el rut del primer sp obtenga el dato faltante o un cursor que me concatene en un solo campo todas sus profesiones para despues mostrarlo u otra forma de poder traer los datos sin que se demore mucho, es decir mejor rendimiento.


Porque los dos casos son lentos.


Saludos.
  #10 (permalink)  
Antiguo 17/04/2009, 09:35
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: 2 Store Procedures o usar Cursor¿?

Asi deberia funcionar.
Código sql:
Ver original
  1. CREATE PROCEDURE beneficiado_listarAtencionUsuarioFecha
  2. @usuario CHAR(20),
  3. @desde datetime,
  4. @hasta datetime
  5.  
  6. AS
  7.  
  8. SELECT b.fecha, b.horaIngreso, b.rut, b.usuario, l.nombre AS usuarioNombre,
  9.     l.apellido AS usuarioApellido, c.nombre AS Nombre, c.apellido AS apellido,
  10.     c.telefono AS telefono, c.celularCod AS celularCod, c.celular AS celular
  11. FROM beneficiado b
  12.     LEFT OUTER JOIN intranet.dbo.contribuyente c ON c.rut = b.rut
  13.     LEFT OUTER JOIN intranet.dbo.logueo l ON l.iid = b.usuario
  14.     LEFT OUTER JOIN beneficiadoProfesion bp ON bp.rut = b.rut
  15.     LEFT OUTER JOIN intranet.dbo.profesion p ON p.ID = bp.ID
  16. WHERE b.usuario = @usuario
  17.     AND b.fecha >= @desde AND b.fecha<= @hasta
  18. ORDER BY b.fecha
Muestrame un ejemplo del resultado de esta consulta, y me dices como quieres que salga.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.

Última edición por flaviovich; 17/04/2009 a las 09:58
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:17.