While

31/10/2006 - 19:35 por Eduardo De Luca | Informe spam
Hola , que tal tengo el siguiente caso (esta resumido , ya que la
explicación funcional es muy extensa y no les quiero quemar la cabeza).

Tabla A

Mov_contable (money)

fecha (datetime)

cant_periodos (int)



Tabla B

Calculo_mov (money)

Fecha (date time)





En la tabla A puedo tener el sgte registro



10.00 31/10/2006 8



El ocho significa que tengo que insertar 8 veces un registro en la tabla B
aplicando un algoritmo financiero muy simple (lo aclaro porque aca no esta
el problema)





Yo pensé (siempre usando el ejemplo mencionado arriba)





Declare @counter int



Set @counter =cant_periodos from tabla A



While (@counter < 9)



Begin



Insert Tabla B ...



Set @counter=@counter + 1



end



el problema que se me presenta es de performace , ya que cuando lo valores
del WHILE son muy elevados se me va el tiempo al diablo .

Alguno me podría ayudar y se le ocurre otra forma de hacerlo?



Desde ya muchas gracias

Preguntas similare

Leer las respuestas

#1 Javier Loria
31/10/2006 - 19:51 | Informe spam
Hola Eduardo:
Puedes usar el WITH para generar una tabla o usar una tabla de numeros
es muy facil:
Con with (SQL 2005):
=WITH Numeros(Num)
AS
(
SELECT 1
UNION ALL
SELECT Num+1 FROM Numeros
WHERE Num<100
)
INSERT TablaB
SELECT ...
FROM TablaA
JOIN Numeros
ON TablaA.CantPeriodos<=Numeros.Num
= En caso de no tener SQL2005 creas primero la tabla numeros, la llenas y
solo haces la ultima parte:
=INSERT TablaB
SELECT ...
FROM TablaA
JOIN Numeros
ON TablaA.CantPeriodos<=Numeros.Num
= Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Eduardo De Luca" wrote in message
news:eKGQftR$




Hola , que tal tengo el siguiente caso (esta resumido , ya que la
explicación funcional es muy extensa y no les quiero quemar la cabeza).

Tabla A

Mov_contable (money)

fecha (datetime)

cant_periodos (int)



Tabla B

Calculo_mov (money)

Fecha (date time)





En la tabla A puedo tener el sgte registro



10.00 31/10/2006 8



El ocho significa que tengo que insertar 8 veces un registro en la tabla B
aplicando un algoritmo financiero muy simple (lo aclaro porque aca no esta
el problema)





Yo pensé (siempre usando el ejemplo mencionado arriba)





Declare @counter int



Set @counter =cant_periodos from tabla A



While (@counter < 9)



Begin



Insert Tabla B ...



Set @counter=@counter + 1



end



el problema que se me presenta es de performace , ya que cuando lo valores
del WHILE son muy elevados se me va el tiempo al diablo .

Alguno me podría ayudar y se le ocurre otra forma de hacerlo?



Desde ya muchas gracias


Respuesta Responder a este mensaje
#2 Eduardo De Luca
31/10/2006 - 20:22 | Informe spam
Gracias Javier , tengo sql2000 cuando me decis llenas la tabla numeros ,
como lo harias , es decir solo tengo el numero no los correlativos


"Javier Loria" escribió en el mensaje
news:%23h6Um2R$
Hola Eduardo:
Puedes usar el WITH para generar una tabla o usar una tabla de numeros
es muy facil:
Con with (SQL 2005):
=> WITH Numeros(Num)
AS
(
SELECT 1
UNION ALL
SELECT Num+1 FROM Numeros
WHERE Num<100
)
INSERT TablaB
SELECT ...
FROM TablaA
JOIN Numeros
ON TablaA.CantPeriodos<=Numeros.Num
=> En caso de no tener SQL2005 creas primero la tabla numeros, la llenas y
solo haces la ultima parte:
=> INSERT TablaB
SELECT ...
FROM TablaA
JOIN Numeros
ON TablaA.CantPeriodos<=Numeros.Num
=> Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Eduardo De Luca" wrote in message
news:eKGQftR$




Hola , que tal tengo el siguiente caso (esta resumido , ya que la
explicación funcional es muy extensa y no les quiero quemar la cabeza).

Tabla A

Mov_contable (money)

fecha (datetime)

cant_periodos (int)



Tabla B

Calculo_mov (money)

Fecha (date time)





En la tabla A puedo tener el sgte registro



10.00 31/10/2006 8



El ocho significa que tengo que insertar 8 veces un registro en la tabla
B aplicando un algoritmo financiero muy simple (lo aclaro porque aca no
esta el problema)





Yo pensé (siempre usando el ejemplo mencionado arriba)





Declare @counter int



Set @counter =cant_periodos from tabla A



While (@counter < 9)



Begin



Insert Tabla B ...



Set @counter=@counter + 1



end



el problema que se me presenta es de performace , ya que cuando lo
valores del WHILE son muy elevados se me va el tiempo al diablo .

Alguno me podría ayudar y se le ocurre otra forma de hacerlo?



Desde ya muchas gracias






Respuesta Responder a este mensaje
#3 Javier Loria
31/10/2006 - 20:35 | Informe spam
Hola Eduardo:
Algo como:
CREATE TABLE Numeros(
Num INT NOT NULL PRIMARY KEY
)
Luego la llenas con un ciclo un select, etc.Si son pocos numeros:
INSERT Numeros(Num)
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
..
SELECT n
Si son muchos usa un ciclo.
Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning
"Eduardo De Luca" wrote in message
news:OiA5nHS$
Gracias Javier , tengo sql2000 cuando me decis llenas la tabla numeros ,
como lo harias , es decir solo tengo el numero no los correlativos


"Javier Loria" escribió en el mensaje
news:%23h6Um2R$
Hola Eduardo:
Puedes usar el WITH para generar una tabla o usar una tabla de numeros
es muy facil:
Con with (SQL 2005):
=>> WITH Numeros(Num)
AS
(
SELECT 1
UNION ALL
SELECT Num+1 FROM Numeros
WHERE Num<100
)
INSERT TablaB
SELECT ...
FROM TablaA
JOIN Numeros
ON TablaA.CantPeriodos<=Numeros.Num
=>> En caso de no tener SQL2005 creas primero la tabla numeros, la llenas y
solo haces la ultima parte:
=>> INSERT TablaB
SELECT ...
FROM TablaA
JOIN Numeros
ON TablaA.CantPeriodos<=Numeros.Num
=>> Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Eduardo De Luca" wrote in message
news:eKGQftR$




Hola , que tal tengo el siguiente caso (esta resumido , ya que la
explicación funcional es muy extensa y no les quiero quemar la cabeza).

Tabla A

Mov_contable (money)

fecha (datetime)

cant_periodos (int)



Tabla B

Calculo_mov (money)

Fecha (date time)





En la tabla A puedo tener el sgte registro



10.00 31/10/2006 8



El ocho significa que tengo que insertar 8 veces un registro en la tabla
B aplicando un algoritmo financiero muy simple (lo aclaro porque aca no
esta el problema)





Yo pensé (siempre usando el ejemplo mencionado arriba)





Declare @counter int



Set @counter =cant_periodos from tabla A



While (@counter < 9)



Begin



Insert Tabla B ...



Set @counter=@counter + 1



end



el problema que se me presenta es de performace , ya que cuando lo
valores del WHILE son muy elevados se me va el tiempo al diablo .

Alguno me podría ayudar y se le ocurre otra forma de hacerlo?



Desde ya muchas gracias










Respuesta Responder a este mensaje
#4 Eduardo De Luca
31/10/2006 - 20:51 | Informe spam
GRacias , por tu ayuda. Pero en realidad si hago un ciclo estoy en lo mismo
que antes , en ves de hacer el ciclo en el insert lo hago en la tabla
"numeros" . Pensa que el ejemplo puse un 8 pero en la realidad son valores
muchos mas grandes , como 140000 o 200000 y a veces mas . Lo probe y
funciona perfecto tu ejemplo . Pero cuando hago el ciclo para insertar la
numeracion pasa lo mismo (la degradacion).
No se te ocurre otra forma ?

Desde ya muchas gracias

"Javier Loria" escribió en el mensaje
news:%23ehqpOS$
Hola Eduardo:
Algo como:
> CREATE TABLE Numeros(
Num INT NOT NULL PRIMARY KEY
)
> Luego la llenas con un ciclo un select, etc.Si son pocos numeros:
INSERT Numeros(Num)
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
..
SELECT n
> Si son muchos usa un ciclo.
Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning
"Eduardo De Luca" wrote in message
news:OiA5nHS$
Gracias Javier , tengo sql2000 cuando me decis llenas la tabla numeros ,
como lo harias , es decir solo tengo el numero no los correlativos


"Javier Loria" escribió en el mensaje
news:%23h6Um2R$
Hola Eduardo:
Puedes usar el WITH para generar una tabla o usar una tabla de
numeros es muy facil:
Con with (SQL 2005):
=>>> WITH Numeros(Num)
AS
(
SELECT 1
UNION ALL
SELECT Num+1 FROM Numeros
WHERE Num<100
)
INSERT TablaB
SELECT ...
FROM TablaA
JOIN Numeros
ON TablaA.CantPeriodos<=Numeros.Num
=>>> En caso de no tener SQL2005 creas primero la tabla numeros, la llenas y
solo haces la ultima parte:
=>>> INSERT TablaB
SELECT ...
FROM TablaA
JOIN Numeros
ON TablaA.CantPeriodos<=Numeros.Num
=>>> Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Eduardo De Luca" wrote in message
news:eKGQftR$




Hola , que tal tengo el siguiente caso (esta resumido , ya que la
explicación funcional es muy extensa y no les quiero quemar la cabeza).

Tabla A

Mov_contable (money)

fecha (datetime)

cant_periodos (int)



Tabla B

Calculo_mov (money)

Fecha (date time)





En la tabla A puedo tener el sgte registro



10.00 31/10/2006 8



El ocho significa que tengo que insertar 8 veces un registro en la
tabla B aplicando un algoritmo financiero muy simple (lo aclaro porque
aca no esta el problema)





Yo pensé (siempre usando el ejemplo mencionado arriba)





Declare @counter int



Set @counter =cant_periodos from tabla A



While (@counter < 9)



Begin



Insert Tabla B ...



Set @counter=@counter + 1



end



el problema que se me presenta es de performace , ya que cuando lo
valores del WHILE son muy elevados se me va el tiempo al diablo .

Alguno me podría ayudar y se le ocurre otra forma de hacerlo?



Desde ya muchas gracias














Respuesta Responder a este mensaje
#5 Javier Loria
31/10/2006 - 21:41 | Informe spam
Hola Eduardo:
Nop, una sola vez creas el ciclo en la tabla y nunca mas.
Pruebalo y veras que es por lo menos 100 veces mas rapido.
Saludos y suerte,

Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Eduardo De Luca" wrote in message
news:%23mUt7XS$
GRacias , por tu ayuda. Pero en realidad si hago un ciclo estoy en lo
mismo que antes , en ves de hacer el ciclo en el insert lo hago en la
tabla "numeros" . Pensa que el ejemplo puse un 8 pero en la realidad son
valores muchos mas grandes , como 140000 o 200000 y a veces mas . Lo
probe y funciona perfecto tu ejemplo . Pero cuando hago el ciclo para
insertar la numeracion pasa lo mismo (la degradacion).
No se te ocurre otra forma ?

Desde ya muchas gracias

"Javier Loria" escribió en el mensaje
news:%23ehqpOS$
Hola Eduardo:
Algo como:
>> CREATE TABLE Numeros(
Num INT NOT NULL PRIMARY KEY
)
>> Luego la llenas con un ciclo un select, etc.Si son pocos numeros:
INSERT Numeros(Num)
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
..
SELECT n
>> Si son muchos usa un ciclo.
Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning
"Eduardo De Luca" wrote in message
news:OiA5nHS$
Gracias Javier , tengo sql2000 cuando me decis llenas la tabla numeros ,
como lo harias , es decir solo tengo el numero no los correlativos


"Javier Loria" escribió en el mensaje
news:%23h6Um2R$
Hola Eduardo:
Puedes usar el WITH para generar una tabla o usar una tabla de
numeros es muy facil:
Con with (SQL 2005):
=>>>> WITH Numeros(Num)
AS
(
SELECT 1
UNION ALL
SELECT Num+1 FROM Numeros
WHERE Num<100
)
INSERT TablaB
SELECT ...
FROM TablaA
JOIN Numeros
ON TablaA.CantPeriodos<=Numeros.Num
=>>>> En caso de no tener SQL2005 creas primero la tabla numeros, la llenas y
solo haces la ultima parte:
=>>>> INSERT TablaB
SELECT ...
FROM TablaA
JOIN Numeros
ON TablaA.CantPeriodos<=Numeros.Num
=>>>> Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Eduardo De Luca" wrote in message
news:eKGQftR$




Hola , que tal tengo el siguiente caso (esta resumido , ya que la
explicación funcional es muy extensa y no les quiero quemar la
cabeza).

Tabla A

Mov_contable (money)

fecha (datetime)

cant_periodos (int)



Tabla B

Calculo_mov (money)

Fecha (date time)





En la tabla A puedo tener el sgte registro



10.00 31/10/2006 8



El ocho significa que tengo que insertar 8 veces un registro en la
tabla B aplicando un algoritmo financiero muy simple (lo aclaro porque
aca no esta el problema)





Yo pensé (siempre usando el ejemplo mencionado arriba)





Declare @counter int



Set @counter =cant_periodos from tabla A



While (@counter < 9)



Begin



Insert Tabla B ...



Set @counter=@counter + 1



end



el problema que se me presenta es de performace , ya que cuando lo
valores del WHILE son muy elevados se me va el tiempo al diablo .

Alguno me podría ayudar y se le ocurre otra forma de hacerlo?



Desde ya muchas gracias


















Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida