Pregunta de Cursores

10/05/2004 - 17:33 por Jorge Eldis | Informe spam
Saludos a todos,

Necesito recorrer una tabla y por cada registro pasarle el parametro a un SP
para que realice un proceso determinado.

La pregunta es:

Como puedo recorrer una tabla sin usar Cursores ya que he leido y me han
explicado aqui en este Grupo que son muy lentos y con bajo desempeño?

Saludos Jorge Eldis

Preguntas similare

Leer las respuestas

#6 Jorge Eldis
12/05/2004 - 16:24 | Informe spam
Hola Ulises como estas, ayer te envie el un backup de la tabla en SQL2000
para que solo la subas a tu server, si me puedes orientar te lo agradezco,
yo sigo investigando para ver como hacerlo.

Como te comentaba con los Cursores si funciona pero lo noto lento.

Saludos Jorge Eldis

"ulises" wrote in message
news:b87701c4378f$a14dfbb0$
Lo que no tengo muy claro es si la clave de busqueda de
los destinos es de un tamaño fijo o variable, en todo caso
enviame la estructura de tus tablas y algunos datos de
ejemplo para poder ayudarte mejor.

Saludos,
Ulises

Hola como estas Ulises.

Ante todo muchas gracias por toda la ayuda y tu tiempo

Mira entendistes perfecto lo que por lo que me explicaste


lo que hay otros
detalles,

1- Los Numeros de destinos son solo partes Ej.

Si llamas a USA seria 001305XXXXXXX, por lo que un codigo


de destino seria
001305, asi que tengo que buscar el la tabla del llamadas


todos los que
empiecen con 001305, sea con LIKE o con LEFT, en


realidad no se cual es
mejor para usar ambo me dan la misma respuesta.

2- Como pueden haber numeros de destinos con semejantes


numeros tengo que
ordenarlos en orden descendente Ej.

001305 y puedo tener 001, como ves 001 se repite en ambos.

Como me sugieres que haga para no usar el Cursor?

Saludos y muchas gracias por tu ayuda.



"ulises" wrote in message
news:af9701c436c1$c2de8ed0$
No sé si te he entendido, pero si tengo, por ejemplo, dos
tablas una de tarifas por minuto y otra de llamadas por
minuto, se puede calcular el costo de la siguiente


manera :

create table tarifas ( clave char(5), nombre char(20),
tarifa decimal(15,2) )
create table llamadas ( secuencia int, duracion int,
destino char(5), costo decimal(15,2) null )
go
insert into tarifas values ( 'DES01','DESTINO 1',1.50 )
insert into tarifas values ( 'DES02','DESTINO 2',10.50 )
insert into tarifas values ( 'DES03','DESTINO 3',7.50 )
insert into llamadas values ( 1, 10, 'DES01',NULL)
insert into llamadas values ( 2, 10, 'DES01',NULL)
insert into llamadas values ( 3, 10, 'DES02',NULL)
insert into llamadas values ( 4, 10, 'DES03',NULL)
go
update llamadas set costo = duracion * tarifa
from tarifas join llamadas on clave = destino
go
select * from llamadas

secuencia duracion destino costo
1 10 DES01 15.00
2 10 DES01 15.00
3 10 DES02 105.00
4 10 DES03 75.00

(4 row(s) affected)

Saludos,
Ulises

Hola Ulices como estas,

La cosa es la siguiente, tengo una tabla de tarifas y una


tabla de registros
para tasar, teniendo encuenta el la duracion de una


llamada ya que es un
registro telefonico, por lo cual, cada destino lleva una


tarifa determinada,
lo que hago es,

Cojo la tabla de destinos y la meto en un Cursor, por


cada registro taso la
tabla de llamadas en dependencia del destino multipicando


la duracion con el
costo del destino.

Asi que tengo que recorrer una tabla (Destinos) para


tasar la otra de
llamadas.

Lo que queria ver era si podia hacerlo sin el Cursor.

Saludos, Gracias




.

Respuesta Responder a este mensaje
#7 Javier Loria
12/05/2004 - 19:47 | Informe spam
Hola Jorge:
Asumiendo un esquema simplificado de las Tablas como:
==CREATE TABLE Tarifas(
DestinoParcial VARCHAR(15)
NOT NULL PRIMARY KEY
, NombreTarifa VARCHAR(25)
NOT NULL UNIQUE
, TarifaxMinuto DECIMAL(9,2)
NOT NULL
)

CREATE TABLE Llamadas(
LlamadaId INT
NOT NULL PRIMARY KEY
, TelefonoDestino VARCHAR(15)
NOT NULL
, DuracionMinutos INT
NOT NULL
)
INSERT Tarifas(DestinoParcial, NombreTarifa, TarifaxMinuto)
SELECT '001' , 'USA' , 1.00 UNION ALL
SELECT '00506' , 'Costa Rica' , 1.25 UNION ALL
SELECT '001305', 'Miami, USA' , 0.80

INSERT Llamadas(LlamadaId, TelefonoDestino, DuracionMinutos)
SELECT 1, '0011234567890', 1 UNION ALL
SELECT 2, '0011234567891', 2 UNION ALL
SELECT 3, '0013054567890', 1 UNION ALL
SELECT 4, '0013054567891', 2 UNION ALL
SELECT 5, '0050622222222', 2 UNION ALL
SELECT 6, '0050622222222', 2
== El problema principal reside en que al hacer el JOIN de Llamadas y
Tarifas, habria 2 tarifas posibles que se pueden aplicar a las llamadas 3 y
4. Se les puede aplicar la tarifa de USA y se les puede aplicar la Tarifa de
Miami. Si asumimos que se debe aplicar la Tarifa mas especifica (o sea la de
mayor largo), en este caso Miami, podriamos crear una vista como sigue:
==CREATE VIEW AsignacionTarifaLlamada
AS
SELECT LlamadaId, MAX(DestinoParcial) AS DestinoParcial
FROM Llamadas
JOIN Tarifas
ON Llamadas.TelefonoDestino LIKE Tarifas.DestinoParcial+'%'
GROUP BY LlamadaID
== En este caso usamos como criterio el MAX del DestinoParcial que nos
brinda de todos los posibles destinos parciales el mas largo. Entonces la
consulta para asignar costos a las Tarifas es:
==SELECT Llamadas.LlamadaID
, Llamadas.TelefonoDestino
, Llamadas.DuracionMinutos
, Tarifas.NombreTarifa
, Tarifas.TarifaxMinuto
, Llamadas.DuracionMinutos*Tarifas.TarifaxMinuto
FROM Llamadas
JOIN AsignacionTarifaLlamada
ON Llamadas.LlamadaID=AsignacionTarifaLlamada.LlamadaID
JOIN Tarifas
ON AsignacionTarifaLlamada.DestinoParcial=Tarifas.DestinoParcial
== Esta consulta debe ser entre 10 y 1000 veces mas rapida que el cursor,
asumiendo que la tabla de llamadas tiene miles de filas. Adicionalmente si
la tabla de Llamadas no tiene muchos UPDATES podrias pensar en
"materializar" la vista creando un indice, lo cual haria las consultas mucho
mas rapidas.

Espero te sirva,

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.
Jorge Eldis escribio:
Hola como estas Ulises.

Ante todo muchas gracias por toda la ayuda y tu tiempo

Mira entendistes perfecto lo que por lo que me explicaste lo que hay
otros detalles,

1- Los Numeros de destinos son solo partes Ej.

Si llamas a USA seria 001305XXXXXXX, por lo que un codigo de destino
seria 001305, asi que tengo que buscar el la tabla del llamadas todos
los que empiecen con 001305, sea con LIKE o con LEFT, en realidad no
se cual es mejor para usar ambo me dan la misma respuesta.

2- Como pueden haber numeros de destinos con semejantes numeros tengo
que ordenarlos en orden descendente Ej.

001305 y puedo tener 001, como ves 001 se repite en ambos.

Como me sugieres que haga para no usar el Cursor?

Saludos y muchas gracias por tu ayuda.



"ulises" wrote in message
news:af9701c436c1$c2de8ed0$
No sé si te he entendido, pero si tengo, por ejemplo, dos
tablas una de tarifas por minuto y otra de llamadas por
minuto, se puede calcular el costo de la siguiente manera :

create table tarifas ( clave char(5), nombre char(20),
tarifa decimal(15,2) )
create table llamadas ( secuencia int, duracion int,
destino char(5), costo decimal(15,2) null )
go
insert into tarifas values ( 'DES01','DESTINO 1',1.50 )
insert into tarifas values ( 'DES02','DESTINO 2',10.50 )
insert into tarifas values ( 'DES03','DESTINO 3',7.50 )
insert into llamadas values ( 1, 10, 'DES01',NULL)
insert into llamadas values ( 2, 10, 'DES01',NULL)
insert into llamadas values ( 3, 10, 'DES02',NULL)
insert into llamadas values ( 4, 10, 'DES03',NULL)
go
update llamadas set costo = duracion * tarifa
from tarifas join llamadas on clave = destino
go
select * from llamadas

secuencia duracion destino costo
1 10 DES01 15.00
2 10 DES01 15.00
3 10 DES02 105.00
4 10 DES03 75.00

(4 row(s) affected)

Saludos,
Ulises

Hola Ulices como estas,

La cosa es la siguiente, tengo una tabla de tarifas y una


tabla de registros
para tasar, teniendo encuenta el la duracion de una


llamada ya que es un
registro telefonico, por lo cual, cada destino lleva una


tarifa determinada,
lo que hago es,

Cojo la tabla de destinos y la meto en un Cursor, por


cada registro taso la
tabla de llamadas en dependencia del destino multipicando


la duracion con el
costo del destino.

Asi que tengo que recorrer una tabla (Destinos) para


tasar la otra de
llamadas.

Lo que queria ver era si podia hacerlo sin el Cursor.

Saludos, Gracias
Respuesta Responder a este mensaje
#8 Jorge Eldis
14/05/2004 - 17:34 | Informe spam
Hola amigos como estan,

Ante todo muchas gracias por el tiempo y la dedicacion que han tendo al
ayudarme.

Al final no use un Cursor mejore la estructura de datos y me guie por sus
consejos.

Muchas gracias nuevamente y saludos.

"Javier Loria" wrote in message
news:
Hola Jorge:
Asumiendo un esquema simplificado de las Tablas como:
==> CREATE TABLE Tarifas(
DestinoParcial VARCHAR(15)
NOT NULL PRIMARY KEY
, NombreTarifa VARCHAR(25)
NOT NULL UNIQUE
, TarifaxMinuto DECIMAL(9,2)
NOT NULL
)

CREATE TABLE Llamadas(
LlamadaId INT
NOT NULL PRIMARY KEY
, TelefonoDestino VARCHAR(15)
NOT NULL
, DuracionMinutos INT
NOT NULL
)
INSERT Tarifas(DestinoParcial, NombreTarifa, TarifaxMinuto)
SELECT '001' , 'USA' , 1.00 UNION ALL
SELECT '00506' , 'Costa Rica' , 1.25 UNION ALL
SELECT '001305', 'Miami, USA' , 0.80

INSERT Llamadas(LlamadaId, TelefonoDestino, DuracionMinutos)
SELECT 1, '0011234567890', 1 UNION ALL
SELECT 2, '0011234567891', 2 UNION ALL
SELECT 3, '0013054567890', 1 UNION ALL
SELECT 4, '0013054567891', 2 UNION ALL
SELECT 5, '0050622222222', 2 UNION ALL
SELECT 6, '0050622222222', 2
==> El problema principal reside en que al hacer el JOIN de Llamadas y
Tarifas, habria 2 tarifas posibles que se pueden aplicar a las llamadas 3


y
4. Se les puede aplicar la tarifa de USA y se les puede aplicar la Tarifa


de
Miami. Si asumimos que se debe aplicar la Tarifa mas especifica (o sea la


de
mayor largo), en este caso Miami, podriamos crear una vista como sigue:
==> CREATE VIEW AsignacionTarifaLlamada
AS
SELECT LlamadaId, MAX(DestinoParcial) AS DestinoParcial
FROM Llamadas
JOIN Tarifas
ON Llamadas.TelefonoDestino LIKE Tarifas.DestinoParcial+'%'
GROUP BY LlamadaID
==> En este caso usamos como criterio el MAX del DestinoParcial que nos
brinda de todos los posibles destinos parciales el mas largo. Entonces la
consulta para asignar costos a las Tarifas es:
==> SELECT Llamadas.LlamadaID
, Llamadas.TelefonoDestino
, Llamadas.DuracionMinutos
, Tarifas.NombreTarifa
, Tarifas.TarifaxMinuto
, Llamadas.DuracionMinutos*Tarifas.TarifaxMinuto
FROM Llamadas
JOIN AsignacionTarifaLlamada
ON Llamadas.LlamadaID=AsignacionTarifaLlamada.LlamadaID
JOIN Tarifas
ON AsignacionTarifaLlamada.DestinoParcial=Tarifas.DestinoParcial
==> Esta consulta debe ser entre 10 y 1000 veces mas rapida que el cursor,
asumiendo que la tabla de llamadas tiene miles de filas. Adicionalmente si
la tabla de Llamadas no tiene muchos UPDATES podrias pensar en
"materializar" la vista creando un indice, lo cual haria las consultas


mucho
mas rapidas.

Espero te sirva,

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.
Jorge Eldis escribio:
> Hola como estas Ulises.
>
> Ante todo muchas gracias por toda la ayuda y tu tiempo
>
> Mira entendistes perfecto lo que por lo que me explicaste lo que hay
> otros detalles,
>
> 1- Los Numeros de destinos son solo partes Ej.
>
> Si llamas a USA seria 001305XXXXXXX, por lo que un codigo de destino
> seria 001305, asi que tengo que buscar el la tabla del llamadas todos
> los que empiecen con 001305, sea con LIKE o con LEFT, en realidad no
> se cual es mejor para usar ambo me dan la misma respuesta.
>
> 2- Como pueden haber numeros de destinos con semejantes numeros tengo
> que ordenarlos en orden descendente Ej.
>
> 001305 y puedo tener 001, como ves 001 se repite en ambos.
>
> Como me sugieres que haga para no usar el Cursor?
>
> Saludos y muchas gracias por tu ayuda.
>
>
>
> "ulises" wrote in message
> news:af9701c436c1$c2de8ed0$
> No sé si te he entendido, pero si tengo, por ejemplo, dos
> tablas una de tarifas por minuto y otra de llamadas por
> minuto, se puede calcular el costo de la siguiente manera :
>
> create table tarifas ( clave char(5), nombre char(20),
> tarifa decimal(15,2) )
> create table llamadas ( secuencia int, duracion int,
> destino char(5), costo decimal(15,2) null )
> go
> insert into tarifas values ( 'DES01','DESTINO 1',1.50 )
> insert into tarifas values ( 'DES02','DESTINO 2',10.50 )
> insert into tarifas values ( 'DES03','DESTINO 3',7.50 )
> insert into llamadas values ( 1, 10, 'DES01',NULL)
> insert into llamadas values ( 2, 10, 'DES01',NULL)
> insert into llamadas values ( 3, 10, 'DES02',NULL)
> insert into llamadas values ( 4, 10, 'DES03',NULL)
> go
> update llamadas set costo = duracion * tarifa
> from tarifas join llamadas on clave = destino
> go
> select * from llamadas
>
> secuencia duracion destino costo
> 1 10 DES01 15.00
> 2 10 DES01 15.00
> 3 10 DES02 105.00
> 4 10 DES03 75.00
>
> (4 row(s) affected)
>
> Saludos,
> Ulises
>
>> Hola Ulices como estas,
>>
>> La cosa es la siguiente, tengo una tabla de tarifas y una
> tabla de registros
>> para tasar, teniendo encuenta el la duracion de una
> llamada ya que es un
>> registro telefonico, por lo cual, cada destino lleva una
> tarifa determinada,
>> lo que hago es,
>>
>> Cojo la tabla de destinos y la meto en un Cursor, por
> cada registro taso la
>> tabla de llamadas en dependencia del destino multipicando
> la duracion con el
>> costo del destino.
>>
>> Asi que tengo que recorrer una tabla (Destinos) para
> tasar la otra de
>> llamadas.
>>
>> Lo que queria ver era si podia hacerlo sin el Cursor.
>>
>> Saludos, Gracias


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