T-SQL / cursores

30/10/2003 - 13:06 por cdiaz | Informe spam
Dado que observo que las T-SQL son mucho más rápidas que los cursoses me
gustaría saber si el siguiente caso tendría una buena solución con T-SQL.
(ahora lo tengo hecho como un procedimiento secuencial)

Datos "reales"
<< Tabla1 >>
Código Fecha Obra
1 01-12-2002 Obra1
2 05-07-2002 Obra2
4 vacío vacío

<< Tabla 2 >>
Código Fecha Obra
1 05-01-2003 Obra4
1 10-01-2003 Obra1
4 05-01-2003 Obra1

El significado de estos datos es:

El código 1 entró en la obra1 el 01-12-2002 y salió el 05-01-2003
El código 1 entró en la obra4 el 05-01-2003 y salió el 10-01-2003
El código 1 entró en la obra1 el 10-01-2003 y todavía está en dicha obra1
El código 2 está en la obra2 desde el 05-07-2002. Está todavía en la obra2.
El código 4 ha aparecido en la obra1 el día 05-01-2003

El objetivo de la T-SQL es obtener los días que ha estado cada uno de los
códigos en cada una de las obras desde una fecha determinada. Cuántos días
hay que facturar a cada una de las obras.

La última fecha de facturación fue el 31-12-2002 y la nueva fecha es el
31-01-2003. Los resultados de facturación que se desean obtener son.

Código Obra Desde
Hasta Días
1 Obra1 01-01-2003 (Fecha de la última
facturación +1) 05-01-2003
5
1 Obra1 10-01-2003
31-01-2003 (Fecha de la facturación actual) 20
1 Obra4 05-01-2003
10-01-2003 4
2 Obra2 01-01-2003 (Fecha de la última
facturación +1) 31-01-2003 (Fecha de la facturación actual)
31
4 Obra1 05-01-2003
31-01-2003 (Fecha de la facturación actual) 26

Gracias de antemano

Preguntas similare

Leer las respuestas

#6 cdiaz
03/11/2003 - 13:02 | Informe spam
FUNCIONA. La parte de facturación la he hecho de la siguiente manera tomando
las ideas de Liliana.

DECLARE @desde datetime, @hasta datetime
SELECT @desde = '20030101', @hasta = '20030131'

SELECT Codigo, Obra
FecEntrada CASE
WHEN FechaEntradaObra < @desde THEN @desde
ELSE FechaEntradaObra
END,
FecSalida CASE
WHEN FechaSalidaObra > @hasta THEN @hasta
WHEN FechaSalidaObra is null then @hasta
ELSE FechaSalidaObra
END,
datediff (dd,
CASE
WHEN FechaEntradaObra < @desde THEN @desde
ELSE FechaEntradaObra
END,
CASE
WHEN FechaSalidaObra > @hasta THEN @hasta
WHEN FechaSalidaObra is null then @hasta
ELSE FechaSalidaObra
END
)
FROM EntradasySalidasMaquinaria
ORDER BY Codigo, FecEntrada

La verdad es que en un primer momento esperaba que funcionara datediff ( dd,
FecEntrada, FecSalida) pero si pongo esto salta el mensaje "El nombre de
columna 'FecEntrada' no es válido." (lo mismo para FecSalida).

He optado por tu opción porque, aunque la de Liliana la entendía, cuando
vuelva a repasar/retocar el código me costaría mucho volverla a entender.

Gracias y enhorabuena por una solución tan buena y tan rápida. Intentaré
hacer el esfuerzo de antes de usar un cursor, hacerlo con un T-SQL. La
actitud la tengo pero TODAVÍA no he conseguido la aptitud.

Un saludo

"Javier Loria" escribió en el mensaje
news:
Mostrar la cita
lo
Mostrar la cita
"cambio
Mostrar la cita
mas
Mostrar la cita
eso
Mostrar la cita
periodos
Mostrar la cita
lo
Mostrar la cita
#7 Javier Loria
04/11/2003 - 05:44 | Informe spam
Hola Carlos:
Manejaste muy bien los CASE.
El CASE es probablmente la mejor herramienta que tienes para eliminar
los CURSORES.
Felicitaciones,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
cdiaz escribio:
Mostrar la cita
#8 Jose Antonio
04/11/2003 - 14:05 | Informe spam
Da la impresión por vuestros comentarios, que nunca hay que usar cursores.
Estoy de acuerdo que hay que intentar evitarlos, pero hay situaciones como
en los triggers con inserciones, actualizaciones y borrados multiples donde
son imprescindibles.

Saludos.
Jose Antonio
"Miguel Egea" escribió en el mensaje
news:
Mostrar la cita
http://www.microsoft.com/spain/tech...9-USER.asp
Mostrar la cita
mensaje
Mostrar la cita
puedo
Mostrar la cita
t1.codigo
Mostrar la cita
AND
Mostrar la cita
el
Mostrar la cita
hecho
Mostrar la cita
de
Mostrar la cita
como
Mostrar la cita
que
Mostrar la cita
el
Mostrar la cita
como
Mostrar la cita
tablas
Mostrar la cita
misma
Mostrar la cita
dicha
Mostrar la cita
es
Mostrar la cita
son.
Mostrar la cita
facturación
Mostrar la cita
#9 Javier Loria
04/11/2003 - 14:47 | Informe spam
Hola Jose Antonio:
Mas que nada en un trigger NO deberias usar cursores. La razon es que el
codigo del trigger "atraza" la transaccion, aumenta los bloqueos y en
general mata el rendimiento del servidor.
Efectivamente en los triggers las inserciones/actualizaciones y borrados
son multiples, pero precisamente la fuerza de SQL esta en este tipo de
codigo.
Si nos mandas un ejemplo podemos trabajar con algo de codigo.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Jose Antonio escribio:
Mostrar la cita
http://www.microsoft.com/spain/tech...9-USER.asp
Mostrar la cita
#10 Jose Antonio
04/11/2003 - 20:04 | Informe spam
Te explico mi problematica Javier.
Cuando tienes una tabla cabecera de pedidos por ejemplo y otra tabla de
lineas de pedidos, y entre la dos tienes una relacion para que las lineas se
eliminen en cascada si se elimina la cabecera del pedido.

Bien al tener definido un trigger en la tabla de lineas para que descuente
de la tabla de productos la cantidad que ya no esta pedida, me encuentro que
si anulas una linea del pedido la tabla deleted tiene una sola fila con lo
cual se lee el producto de esta fila y se le descuenta la cantidad de forma
correcta.

Pero cuando borras la cabecera del pedido la propia relacion de SQL se
encarga de anular las lineas del pedido y el trigger tambien se dipara
ahora, pero la tabla inserted tiene tantas filas como lineas tenia el
pedido.

Cada una con un producto diferente, entonces yo ahora utilizo un cursor
rapido de lectura solo hacia adelante para recorrer la tabla inserted. Y no
he encontrado otra solución por mas que la he buscado.

Si tienes una solución para esto sin cursores, te agradecería la expusieses
y yo tambien me uniria al club.

Saludos
Jose Antonio
"Javier Loria" escribió en el mensaje
news:
Mostrar la cita
el
Mostrar la cita
borrados
Mostrar la cita
http://www.microsoft.com/spain/tech...9-USER.asp
Mostrar la cita
Ads by Google
Search Busqueda sugerida