RECORRER TABLA SQL

07/04/2005 - 18:50 por MIKE | Informe spam
Caso de RECORRER TABLA SQL.
Hola a todos.
Quiero saber si existe otra Forma de Recorrer una Tabla
SQL que tiene como 17 MIllones de Registros, la cual se
Recorre y linea a linea se llenan sus Datos a Otras 2
Tablas (Ya que están en Codigos que tienen diferentes
significados).
Estoy usando un DECLARE CURSOR-OPEN CURSOR,etc.
Pero el proceso me lleva como 7 u 8 horas.
Quiero saber si puedo mejorar esto o que otra forma puedo
usar.



Tengo una Tabla Principal que es la que Recorro, y dos
Tablas Secundarias una de Datos de Identidad y otra de
Saldos que lleno.



Este es una parte del Contenido de la Tabla Principal TP
que tiene un Solo Campo . Este se refiere a un Solo
Cliente



1E000428886620030430 120092920 1
0020344000000000000000006560NU#EZ TORRAS JOSE MARIO

2E0004288866001073141103060000000000000000004859340

2E0004288866001073841402290000000000000000004941900

2E0004288866001413142503060000007030000000009268704

2E0004288866001413142903010000000000000000009268704

2E0004288866001413812401000000000000000000001343154

2E0004288866001413842402090000000000000000007616404



Asi como este existen datos o lineas alrededor de 17
Millones,



Lo que Hago es usar un Proc Alm. En el que usao el
Declare Cursor , etc.



Por ejemplo , si la Cadena empieza con '1' son datos
para la Tabla Secundaria TS1 y si comienza con '2' para
la

Tabla Secundaria TS2.

El Nombre lo saco usando SUBSTRING, igual saco las
Cuentas Contables , su Codigo de Doc de Identidad, Nro de
Documento de Identidad,

Saldos, dias de atraso, Porcentajes de Calificación de
Riesgo.,etc



Es decir tomo cada Linea y tengo que desagregar datos y
enviarlos Bien a la Tabla Secundaria 1 o 2.



Ese es en Resumen el Problema.



Espero tu Amable ayuda o sugerencias

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
07/04/2005 - 19:03 | Informe spam
Mike,

Trata creando dos sentencias insert, una para ts1 y otra para ts2. NO CURSOR.

Algo asi como:

insert into ts1 (col1, col2, ..., coln)
select substring(...) as col1, ..., substring(...) as coln
from tabla_principal
where unica_columna like '1%'

insert into ts2 (col1, col2, ..., coln)
select substring(...) as col1, ..., substring(...) as coln
from tabla_principal
where unica_columna like '2%'


AMB

"MIKE" wrote:

Caso de RECORRER TABLA SQL.
Hola a todos.
Quiero saber si existe otra Forma de Recorrer una Tabla
SQL que tiene como 17 MIllones de Registros, la cual se
Recorre y linea a linea se llenan sus Datos a Otras 2
Tablas (Ya que están en Codigos que tienen diferentes
significados).
Estoy usando un DECLARE CURSOR-OPEN CURSOR,etc.
Pero el proceso me lleva como 7 u 8 horas.
Quiero saber si puedo mejorar esto o que otra forma puedo
usar.



Tengo una Tabla Principal que es la que Recorro, y dos
Tablas Secundarias una de Datos de Identidad y otra de
Saldos que lleno.



Este es una parte del Contenido de la Tabla Principal TP
que tiene un Solo Campo . Este se refiere a un Solo
Cliente



1E000428886620030430 120092920 1
0020344000000000000000006560NU#EZ TORRAS JOSE MARIO

2E0004288866001073141103060000000000000000004859340

2E0004288866001073841402290000000000000000004941900

2E0004288866001413142503060000007030000000009268704

2E0004288866001413142903010000000000000000009268704

2E0004288866001413812401000000000000000000001343154

2E0004288866001413842402090000000000000000007616404



Asi como este existen datos o lineas alrededor de 17
Millones,



Lo que Hago es usar un Proc Alm. En el que usao el
Declare Cursor , etc.



Por ejemplo , si la Cadena empieza con '1' son datos
para la Tabla Secundaria TS1 y si comienza con '2' para
la

Tabla Secundaria TS2.

El Nombre lo saco usando SUBSTRING, igual saco las
Cuentas Contables , su Codigo de Doc de Identidad, Nro de
Documento de Identidad,

Saldos, dias de atraso, Porcentajes de Calificación de
Riesgo.,etc



Es decir tomo cada Linea y tengo que desagregar datos y
enviarlos Bien a la Tabla Secundaria 1 o 2.



Ese es en Resumen el Problema.



Espero tu Amable ayuda o sugerencias


Respuesta Responder a este mensaje
#2 Salvador Ramos
07/04/2005 - 19:08 | Informe spam
Hola:

Lo que indicas se puede hacer (creo, aunque has dado poca información) de
una forma sencilla con un INSERT INTO SELECT. Y seguro que irá mucho más
rápido.

Si es posible, enviamos más detalles del proceso, y pon el script de código
que estás utilizando, así como el DDL de las tablas que intervienen.


Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)

"MIKE" escribió en el mensaje
news:025701c53b91$f2cf0f40$
Caso de RECORRER TABLA SQL.
Hola a todos.
Quiero saber si existe otra Forma de Recorrer una Tabla
SQL que tiene como 17 MIllones de Registros, la cual se
Recorre y linea a linea se llenan sus Datos a Otras 2
Tablas (Ya que están en Codigos que tienen diferentes
significados).
Estoy usando un DECLARE CURSOR-OPEN CURSOR,etc.
Pero el proceso me lleva como 7 u 8 horas.
Quiero saber si puedo mejorar esto o que otra forma puedo
usar.



Tengo una Tabla Principal que es la que Recorro, y dos
Tablas Secundarias una de Datos de Identidad y otra de
Saldos que lleno.



Este es una parte del Contenido de la Tabla Principal TP
que tiene un Solo Campo . Este se refiere a un Solo
Cliente



1E000428886620030430 120092920 1
0020344000000000000000006560NU#EZ TORRAS JOSE MARIO

2E0004288866001073141103060000000000000000004859340

2E0004288866001073841402290000000000000000004941900

2E0004288866001413142503060000007030000000009268704

2E0004288866001413142903010000000000000000009268704

2E0004288866001413812401000000000000000000001343154

2E0004288866001413842402090000000000000000007616404



Asi como este existen datos o lineas alrededor de 17
Millones,



Lo que Hago es usar un Proc Alm. En el que usao el
Declare Cursor , etc.



Por ejemplo , si la Cadena empieza con '1' son datos
para la Tabla Secundaria TS1 y si comienza con '2' para
la

Tabla Secundaria TS2.

El Nombre lo saco usando SUBSTRING, igual saco las
Cuentas Contables , su Codigo de Doc de Identidad, Nro de
Documento de Identidad,

Saldos, dias de atraso, Porcentajes de Calificación de
Riesgo.,etc



Es decir tomo cada Linea y tengo que desagregar datos y
enviarlos Bien a la Tabla Secundaria 1 o 2.



Ese es en Resumen el Problema.



Espero tu Amable ayuda o sugerencias
Respuesta Responder a este mensaje
#3 Mike
07/04/2005 - 19:35 | Informe spam
Este es el Sp que Uso :

CREATE PROCEDURE xxx_DatRcc808_Sp
AS
BEGIN



DECLARE @ccadpri char(354) ,@LM1 CHAR(1),@LM2 CHAR
(10),@LM3 CHAR(8),@LM4 CHAR(1),@LM5 CHAR(11),@LM6 CHAR
(1),@LM7 CHAR(12),@LM8 CHAR(1),@LM9 CHAR(1),@LM10
TINYINT,@LM11 NUMERIC(7,2),@LM12 NUMERIC(7,2),@LM13
NUMERIC(7,2),@LM14 NUMERIC(7,2),@LM15 NUMERIC(7,2),@LM16
CHAR(120),@LM17 CHAR(40) , @LM18 CHAR(40) , @LM19 CHAR
(40) , @LM20 CHAR(40) , @LM21 CHAR(1)

DECLARE @LD1 CHAR(1),@LD2 CHAR(10),@LD3 CHAR(5),@LD4 CHAR
(1),@LD5 CHAR(14),@LD6 SMALLINT,@LD7 NUMERIC(15,2),@LD8
CHAR(1)

DECLARE @A11 NUMERIC(7,2) ,@A12 TINYINT,@A21 NUMERIC
(7,2) ,@A22 TINYINT,@A31 NUMERIC(7,2) ,@A32 TINYINT,@A41
NUMERIC(7,2) ,@A42 TINYINT,@A51 NUMERIC(7,2) ,@A52 TINYINT
DECLARE @LMAX DECIMAL(7,2),@LSUF TINYINT

DECLARE cur_rcc CURSOR FOR
SELECT ccadpri FROM URIRCCTOT808

OPEN cur_rcc

FETCH NEXT FROM cur_rcc
INTO @ccadpri

WHILE @@FETCH_STATUS = 0
BEGIN
SET @LM1 = SUBSTRING(@CCADPRI,1,1) -- 1 Identidad o
2 Saldos
IF @LM1 = '1'
BEGIN
SET @LM2 = SUBSTRING(@CCADPRI,2,10) -- cCodSbs
SET @LM3 = SUBSTRING(@CCADPRI,12,8) --cFecMes
SET @LM4 = SUBSTRING(@CCADPRI,20,1) --cTiDoTr
SET @LM5 = SUBSTRING(@CCADPRI,21,11) --cNoDoTr
SET @LM6 = SUBSTRING(@CCADPRI,32,1) -- cTiDoCi
SET @LM7 = SUBSTRING(@CCADPRI,33,12) --cNuDoCi
SET @LM8 = SUBSTRING(@CCADPRI,45,1) -- cTipPer
SET @LM9 = SUBSTRING(@CCADPRI,46,1) --cTipEmp
SET @LM10 = CAST(SUBSTRING(@CCADPRI,47,3) AS
TINYINT) -- nCanEnt
SET @LM11 = ROUND(CAST(SUBSTRING
(@CCADPRI,50,5) AS NUMERIC(7,2))/100,2) --nPorCal0
SET @LM12 = ROUND(CAST(SUBSTRING
(@CCADPRI,55,5) AS NUMERIC(7,2))/100,2) --nPorCal1
SET @LM13 = ROUND(CAST(SUBSTRING
(@CCADPRI,60,5) AS NUMERIC(7,2))/100,2) --nPorCal2
SET @LM14 = ROUND(CAST(SUBSTRING
(@CCADPRI,65,5) AS NUMERIC(7,2))/100,2) --nPorCal3
SET @LM15 = ROUND(CAST(SUBSTRING
(@CCADPRI,70,5) AS NUMERIC(7,2))/100,2) --nPorCal4
SET @LM16 = SUBSTRING(@CCADPRI,75,120)
cApePat
SET @LM17 = SUBSTRING(@CCADPRI,195,40)
cApeMat
SET @LM18 = SUBSTRING(@CCADPRI,235,40)
cApeCas
SET @LM19 = SUBSTRING(@CCADPRI,275,40)
cPriNom
SET @LM20 = SUBSTRING(@CCADPRI,315,40)
cSegNom

SET @A11 = @LM11
SET @A12 = 0
SET @A21 = @LM12
SET @A22 = 1
SET @A31 = @LM13
SET @A32 = 2
SET @A41 = @LM14
SET @A42 = 3
SET @A51 = @LM15
SET @A52 = 4

SET @LMAX = @A51
SET @LSUF =
@A52

IF @A51 > 20
BEGIN
SET @LMAX = @A51
SET @LSUF =
@A52

END
ELSE
IF @A41 >
20

BEGIN

SET @LMAX = @A41
SET @LSUF =
@A42

END
ELSE
IF @A31 >
20

BEGIN
SET @LMAX = @A31
SET @LSUF =
@A32

END
ELSE
IF @A21 >
20

BEGIN
SET @LMAX = @A21
SET @LSUF =
@A22

END
ELSE
IF @A11 >
20

BEGIN
SET @LMAX = @A11
SET @LSUF =
@A12

END

SET @LM21 = CAST(@LSUF AS CHAR(1))

INSERT INTO RCCMAE808 VALUES
(@LM1,@LM2,@LM3,@LM4,@LM5,@LM6,@LM7,@LM8,@LM9,@LM10,@LM11,
@LM12,@LM13,@LM14,@LM15,@LM16,@LM17,@LM18,
@LM19,@LM20,@LM21)

END
ELSE
BEGIN
SET @LD1 = '2'
SET @LD2 = SUBSTRING(@CCADPRI,2,10) -- cCodSbs
SET @LD3 = SUBSTRING(@CCADPRI,12,5) --cCodEmp
SET @LD4 = SUBSTRING(@CCADPRI,17,1) cTipCre
SET @LD5 = SUBSTRING(@CCADPRI,18,14) -
cCtaCon
SET @LD6 = CAST(SUBSTRING(@CCADPRI,32,4) AS
INT) nDiaAtr
SET @LD7 = ROUND(CAST(SUBSTRING(@CCADPRI,36,15)
AS NUMERIC(15,2))/100,2) nSaldos
SET @LD8 = SUBSTRING(@CCADPRI,51,1)
cCalRie

INSERT INTO RCCSAL808 VALUES
(@LD1,@LD2,@LD3,@LD4,@LD5,@LD6,@LD7,@LD8)

END
FETCH NEXT FROM cur_rcc
INTO @ccadpri
END

CLOSE cur_rcc
DEALLOCATE cur_rcc

END
GO
-
Gracias por su Ayuda


Hola:

Lo que indicas se puede hacer (creo, aunque has dado


poca información) de
una forma sencilla con un INSERT INTO SELECT. Y seguro


que irá mucho más
rápido.

Si es posible, enviamos más detalles del proceso, y pon


el script de código
que estás utilizando, así como el DDL de las tablas que


intervienen.


Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows


DNA y .NET)

"MIKE" escribió en el


mensaje
news:025701c53b91$f2cf0f40$
Caso de RECORRER TABLA SQL.
Hola a todos.
Quiero saber si existe otra Forma de Recorrer una Tabla
SQL que tiene como 17 MIllones de Registros, la cual se
Recorre y linea a linea se llenan sus Datos a Otras 2
Tablas (Ya que están en Codigos que tienen diferentes
significados).
Estoy usando un DECLARE CURSOR-OPEN CURSOR,etc.
Pero el proceso me lleva como 7 u 8 horas.
Quiero saber si puedo mejorar esto o que otra forma puedo
usar.



Tengo una Tabla Principal que es la que Recorro, y dos
Tablas Secundarias una de Datos de Identidad y otra de
Saldos que lleno.



Este es una parte del Contenido de la Tabla Principal TP
que tiene un Solo Campo . Este se refiere a un Solo
Cliente



1E000428886620030430 120092920 1
0020344000000000000000006560NU#EZ TORRAS JOSE MARIO

2E0004288866001073141103060000000000000000004859340

2E0004288866001073841402290000000000000000004941900

2E0004288866001413142503060000007030000000009268704

2E0004288866001413142903010000000000000000009268704

2E0004288866001413812401000000000000000000001343154

2E0004288866001413842402090000000000000000007616404



Asi como este existen datos o lineas alrededor de 17
Millones,



Lo que Hago es usar un Proc Alm. En el que usao el
Declare Cursor , etc.



Por ejemplo , si la Cadena empieza con '1' son datos
para la Tabla Secundaria TS1 y si comienza con '2' para
la

Tabla Secundaria TS2.

El Nombre lo saco usando SUBSTRING, igual saco las
Cuentas Contables , su Codigo de Doc de Identidad, Nro de
Documento de Identidad,

Saldos, dias de atraso, Porcentajes de Calificación de
Riesgo.,etc



Es decir tomo cada Linea y tengo que desagregar datos y
enviarlos Bien a la Tabla Secundaria 1 o 2.



Ese es en Resumen el Problema.



Espero tu Amable ayuda o sugerencias


.

Respuesta Responder a este mensaje
#4 Salvador Ramos
08/04/2005 - 11:45 | Informe spam
Eso mismo lo puedes resolver con INSERT INTO SELECT y la utilización de
CASE.

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)

"Mike" escribió en el mensaje
news:11b001c53b98$33df7f00$
Este es el Sp que Uso :

CREATE PROCEDURE xxx_DatRcc808_Sp
AS
BEGIN



DECLARE @ccadpri char(354) ,@LM1 CHAR(1),@LM2 CHAR
(10),@LM3 CHAR(8),@LM4 CHAR(1),@LM5 CHAR(11),@LM6 CHAR
(1),@LM7 CHAR(12),@LM8 CHAR(1),@LM9 CHAR(1),@LM10
TINYINT,@LM11 NUMERIC(7,2),@LM12 NUMERIC(7,2),@LM13
NUMERIC(7,2),@LM14 NUMERIC(7,2),@LM15 NUMERIC(7,2),@LM16
CHAR(120),@LM17 CHAR(40) , @LM18 CHAR(40) , @LM19 CHAR
(40) , @LM20 CHAR(40) , @LM21 CHAR(1)

DECLARE @LD1 CHAR(1),@LD2 CHAR(10),@LD3 CHAR(5),@LD4 CHAR
(1),@LD5 CHAR(14),@LD6 SMALLINT,@LD7 NUMERIC(15,2),@LD8
CHAR(1)

DECLARE @A11 NUMERIC(7,2) ,@A12 TINYINT,@A21 NUMERIC
(7,2) ,@A22 TINYINT,@A31 NUMERIC(7,2) ,@A32 TINYINT,@A41
NUMERIC(7,2) ,@A42 TINYINT,@A51 NUMERIC(7,2) ,@A52 TINYINT
DECLARE @LMAX DECIMAL(7,2),@LSUF TINYINT

DECLARE cur_rcc CURSOR FOR
SELECT ccadpri FROM URIRCCTOT808

OPEN cur_rcc

FETCH NEXT FROM cur_rcc
INTO @ccadpri

WHILE @@FETCH_STATUS = 0
BEGIN
SET @LM1 = SUBSTRING(@CCADPRI,1,1) -- 1 Identidad o
2 Saldos
IF @LM1 = '1'
BEGIN
SET @LM2 = SUBSTRING(@CCADPRI,2,10) -- cCodSbs
SET @LM3 = SUBSTRING(@CCADPRI,12,8) --cFecMes
SET @LM4 = SUBSTRING(@CCADPRI,20,1) --cTiDoTr
SET @LM5 = SUBSTRING(@CCADPRI,21,11) --cNoDoTr
SET @LM6 = SUBSTRING(@CCADPRI,32,1) -- cTiDoCi
SET @LM7 = SUBSTRING(@CCADPRI,33,12) --cNuDoCi
SET @LM8 = SUBSTRING(@CCADPRI,45,1) -- cTipPer
SET @LM9 = SUBSTRING(@CCADPRI,46,1) --cTipEmp
SET @LM10 = CAST(SUBSTRING(@CCADPRI,47,3) AS
TINYINT) -- nCanEnt
SET @LM11 = ROUND(CAST(SUBSTRING
(@CCADPRI,50,5) AS NUMERIC(7,2))/100,2) --nPorCal0
SET @LM12 = ROUND(CAST(SUBSTRING
(@CCADPRI,55,5) AS NUMERIC(7,2))/100,2) --nPorCal1
SET @LM13 = ROUND(CAST(SUBSTRING
(@CCADPRI,60,5) AS NUMERIC(7,2))/100,2) --nPorCal2
SET @LM14 = ROUND(CAST(SUBSTRING
(@CCADPRI,65,5) AS NUMERIC(7,2))/100,2) --nPorCal3
SET @LM15 = ROUND(CAST(SUBSTRING
(@CCADPRI,70,5) AS NUMERIC(7,2))/100,2) --nPorCal4
SET @LM16 = SUBSTRING(@CCADPRI,75,120)
cApePat
SET @LM17 = SUBSTRING(@CCADPRI,195,40)
cApeMat
SET @LM18 = SUBSTRING(@CCADPRI,235,40)
cApeCas
SET @LM19 = SUBSTRING(@CCADPRI,275,40)
cPriNom
SET @LM20 = SUBSTRING(@CCADPRI,315,40)
cSegNom

SET @A11 = @LM11
SET @A12 = 0
SET @A21 = @LM12
SET @A22 = 1
SET @A31 = @LM13
SET @A32 = 2
SET @A41 = @LM14
SET @A42 = 3
SET @A51 = @LM15
SET @A52 = 4

SET @LMAX = @A51
SET @LSUF @A52

IF @A51 > 20
BEGIN
SET @LMAX = @A51
SET @LSUF @A52

END
ELSE
IF @A41 >
20

BEGIN

SET @LMAX = @A41
SET @LSUF @A42

END
ELSE
IF @A31 >
20

BEGIN
SET @LMAX = @A31
SET @LSUF @A32

END
ELSE
IF @A21 >
20

BEGIN
SET @LMAX = @A21
SET @LSUF @A22

END
ELSE
IF @A11 >
20

BEGIN
SET @LMAX = @A11
SET @LSUF @A12

END

SET @LM21 = CAST(@LSUF AS CHAR(1))

INSERT INTO RCCMAE808 VALUES
(@LM1,@LM2,@LM3,@LM4,@LM5,@LM6,@LM7,@LM8,@LM9,@LM10,@LM11,
@LM12,@LM13,@LM14,@LM15,@LM16,@LM17,@LM18,
@LM19,@LM20,@LM21)

END
ELSE
BEGIN
SET @LD1 = '2'
SET @LD2 = SUBSTRING(@CCADPRI,2,10) -- cCodSbs
SET @LD3 = SUBSTRING(@CCADPRI,12,5) --cCodEmp
SET @LD4 = SUBSTRING(@CCADPRI,17,1) cTipCre
SET @LD5 = SUBSTRING(@CCADPRI,18,14) -
cCtaCon
SET @LD6 = CAST(SUBSTRING(@CCADPRI,32,4) AS
INT) nDiaAtr
SET @LD7 = ROUND(CAST(SUBSTRING(@CCADPRI,36,15)
AS NUMERIC(15,2))/100,2) nSaldos
SET @LD8 = SUBSTRING(@CCADPRI,51,1)
cCalRie

INSERT INTO RCCSAL808 VALUES
(@LD1,@LD2,@LD3,@LD4,@LD5,@LD6,@LD7,@LD8)

END
FETCH NEXT FROM cur_rcc
INTO @ccadpri
END

CLOSE cur_rcc
DEALLOCATE cur_rcc

END
GO
-
Gracias por su Ayuda


Hola:

Lo que indicas se puede hacer (creo, aunque has dado


poca información) de
una forma sencilla con un INSERT INTO SELECT. Y seguro


que irá mucho más
rápido.

Si es posible, enviamos más detalles del proceso, y pon


el script de código
que estás utilizando, así como el DDL de las tablas que


intervienen.


Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows


DNA y .NET)

"MIKE" escribió en el


mensaje
news:025701c53b91$f2cf0f40$
Caso de RECORRER TABLA SQL.
Hola a todos.
Quiero saber si existe otra Forma de Recorrer una Tabla
SQL que tiene como 17 MIllones de Registros, la cual se
Recorre y linea a linea se llenan sus Datos a Otras 2
Tablas (Ya que están en Codigos que tienen diferentes
significados).
Estoy usando un DECLARE CURSOR-OPEN CURSOR,etc.
Pero el proceso me lleva como 7 u 8 horas.
Quiero saber si puedo mejorar esto o que otra forma puedo
usar.



Tengo una Tabla Principal que es la que Recorro, y dos
Tablas Secundarias una de Datos de Identidad y otra de
Saldos que lleno.



Este es una parte del Contenido de la Tabla Principal TP
que tiene un Solo Campo . Este se refiere a un Solo
Cliente



1E000428886620030430 120092920 1
0020344000000000000000006560NU#EZ TORRAS JOSE MARIO

2E0004288866001073141103060000000000000000004859340

2E0004288866001073841402290000000000000000004941900

2E0004288866001413142503060000007030000000009268704

2E0004288866001413142903010000000000000000009268704

2E0004288866001413812401000000000000000000001343154

2E0004288866001413842402090000000000000000007616404



Asi como este existen datos o lineas alrededor de 17
Millones,



Lo que Hago es usar un Proc Alm. En el que usao el
Declare Cursor , etc.



Por ejemplo , si la Cadena empieza con '1' son datos
para la Tabla Secundaria TS1 y si comienza con '2' para
la

Tabla Secundaria TS2.

El Nombre lo saco usando SUBSTRING, igual saco las
Cuentas Contables , su Codigo de Doc de Identidad, Nro de
Documento de Identidad,

Saldos, dias de atraso, Porcentajes de Calificación de
Riesgo.,etc



Es decir tomo cada Linea y tengo que desagregar datos y
enviarlos Bien a la Tabla Secundaria 1 o 2.



Ese es en Resumen el Problema.



Espero tu Amable ayuda o sugerencias


.

Respuesta Responder a este mensaje
#5 Jonathan Porras
08/04/2005 - 16:21 | Informe spam
Hola amigos. Recorrer una tabla con un cursor en la
mayoría de los casos es muy lento. Lo que yo he hecho en
ocasiones es hacer una iteración apie; es decir, un ciclo
que que yo mismo controlo. Eso si, como en todo ciclo,
debes tener mucho cuidado, manejar muy bien las
condiciones de salida para que no se te encicle. Si los
registros de tu tabla tienen llave primaria, entonces si
puedes hacer eso. No se si sea la mejor solución pero
funciona.
Sería algo similar a lo siguiente:

declare @totalregistros int
set @totalregistros = select count(*) from tabla
(BEGIN TRANSACTION
ALTER TABLE dbo.PRODUCTOS ADD
Leido char(1) NULL
GO
COMMIT

declare @registrosleido int = 0
while (@registrosleido < @totalregistros)
begin
set rowcount 1 --para seleccionar solo 1 registro

select @registroleido = select registro from tabla

where leido = null


leerlo de nuevo.
el que leiste.
update Tabla set leido = 1
and where registro = @registrolido


@registrosleido = @registrosleido + 1

end



SALUDOS Y SUERTE.

Eso mismo lo puedes resolver con INSERT INTO SELECT y la


utilización de
CASE.

Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows


DNA y .NET)

"Mike" escribió en el


mensaje
news:11b001c53b98$33df7f00$
Este es el Sp que Uso :

CREATE PROCEDURE xxx_DatRcc808_Sp
AS
BEGIN



DECLARE @ccadpri char(354) ,@LM1 CHAR(1),@LM2 CHAR
(10),@LM3 CHAR(8),@LM4 CHAR(1),@LM5 CHAR(11),@LM6 CHAR
(1),@LM7 CHAR(12),@LM8 CHAR(1),@LM9 CHAR(1),@LM10
TINYINT,@LM11 NUMERIC(7,2),@LM12 NUMERIC(7,2),@LM13
NUMERIC(7,2),@LM14 NUMERIC(7,2),@LM15 NUMERIC(7,2),@LM16
CHAR(120),@LM17 CHAR(40) , @LM18 CHAR(40) , @LM19 CHAR
(40) , @LM20 CHAR(40) , @LM21 CHAR(1)

DECLARE @LD1 CHAR(1),@LD2 CHAR(10),@LD3 CHAR(5),@LD4 CHAR
(1),@LD5 CHAR(14),@LD6 SMALLINT,@LD7 NUMERIC(15,2),@LD8
CHAR(1)

DECLARE @A11 NUMERIC(7,2) ,@A12 TINYINT,@A21 NUMERIC
(7,2) ,@A22 TINYINT,@A31 NUMERIC(7,2) ,@A32 TINYINT,@A41
NUMERIC(7,2) ,@A42 TINYINT,@A51 NUMERIC(7,2) ,@A52 TINYINT
DECLARE @LMAX DECIMAL(7,2),@LSUF TINYINT

DECLARE cur_rcc CURSOR FOR
SELECT ccadpri FROM URIRCCTOT808

OPEN cur_rcc

FETCH NEXT FROM cur_rcc
INTO @ccadpri

WHILE @@FETCH_STATUS = 0
BEGIN
SET @LM1 = SUBSTRING(@CCADPRI,1,1) -- 1 Identidad o
2 Saldos
IF @LM1 = '1'
BEGIN
SET @LM2 = SUBSTRING(@CCADPRI,2,10) -- cCodSbs
SET @LM3 = SUBSTRING(@CCADPRI,12,8) --cFecMes
SET @LM4 = SUBSTRING(@CCADPRI,20,1) --cTiDoTr
SET @LM5 = SUBSTRING(@CCADPRI,21,11) --cNoDoTr
SET @LM6 = SUBSTRING(@CCADPRI,32,1) -- cTiDoCi
SET @LM7 = SUBSTRING(@CCADPRI,33,12) --cNuDoCi
SET @LM8 = SUBSTRING(@CCADPRI,45,1) -- cTipPer
SET @LM9 = SUBSTRING(@CCADPRI,46,1) --cTipEmp
SET @LM10 = CAST(SUBSTRING(@CCADPRI,47,3) AS
TINYINT) -- nCanEnt
SET @LM11 = ROUND(CAST(SUBSTRING
(@CCADPRI,50,5) AS NUMERIC(7,2))/100,2) --nPorCal0
SET @LM12 = ROUND(CAST(SUBSTRING
(@CCADPRI,55,5) AS NUMERIC(7,2))/100,2) --nPorCal1
SET @LM13 = ROUND(CAST(SUBSTRING
(@CCADPRI,60,5) AS NUMERIC(7,2))/100,2) --nPorCal2
SET @LM14 = ROUND(CAST(SUBSTRING
(@CCADPRI,65,5) AS NUMERIC(7,2))/100,2) --nPorCal3
SET @LM15 = ROUND(CAST(SUBSTRING
(@CCADPRI,70,5) AS NUMERIC(7,2))/100,2) --nPorCal4
SET @LM16 = SUBSTRING(@CCADPRI,75,120)
cApePat
SET @LM17 = SUBSTRING(@CCADPRI,195,40)
cApeMat
SET @LM18 = SUBSTRING(@CCADPRI,235,40)
cApeCas
SET @LM19 = SUBSTRING(@CCADPRI,275,40)
cPriNom
SET @LM20 = SUBSTRING(@CCADPRI,315,40)
cSegNom

SET @A11 = @LM11
SET @A12 = 0
SET @A21 = @LM12
SET @A22 = 1
SET @A31 = @LM13
SET @A32 = 2
SET @A41 = @LM14
SET @A42 = 3
SET @A51 = @LM15
SET @A52 = 4

SET @LMAX = @A51
SET @LSUF >@A52

IF @A51 > 20
BEGIN
SET @LMAX = @A51
SET @LSUF >@A52

END
ELSE
IF @A41 >
20

BEGIN

SET @LMAX = @A41
SET @LSUF >@A42

END
ELSE
IF @A31 >
20

BEGIN
SET @LMAX = @A31
SET @LSUF >@A32

END
ELSE
IF @A21 >
20

BEGIN
SET @LMAX = @A21
SET @LSUF >@A22

END
ELSE
IF @A11 >
20

BEGIN
SET @LMAX = @A11
SET @LSUF >@A12

END

SET @LM21 = CAST(@LSUF AS CHAR(1))

INSERT INTO RCCMAE808 VALUES
(@LM1,@LM2,@LM3,@LM4,@LM5,@LM6,@LM7,@LM8,@LM9,@LM10,@LM11,
@LM12,@LM13,@LM14,@LM15,@LM16,@LM17,@LM18,
@LM19,@LM20,@LM21)

END
ELSE
BEGIN
SET @LD1 = '2'
SET @LD2 = SUBSTRING(@CCADPRI,2,10) -- cCodSbs
SET @LD3 = SUBSTRING(@CCADPRI,12,5) --cCodEmp
SET @LD4 = SUBSTRING(@CCADPRI,17,1) cTipCre
SET @LD5 = SUBSTRING(@CCADPRI,18,14) -
cCtaCon
SET @LD6 = CAST(SUBSTRING(@CCADPRI,32,4) AS
INT) nDiaAtr
SET @LD7 = ROUND(CAST(SUBSTRING(@CCADPRI,36,15)
AS NUMERIC(15,2))/100,2) nSaldos
SET @LD8 = SUBSTRING(@CCADPRI,51,1)
cCalRie

INSERT INTO RCCSAL808 VALUES
(@LD1,@LD2,@LD3,@LD4,@LD5,@LD6,@LD7,@LD8)

END
FETCH NEXT FROM cur_rcc
INTO @ccadpri
END

CLOSE cur_rcc
DEALLOCATE cur_rcc

END
GO
-
Gracias por su Ayuda


Hola:

Lo que indicas se puede hacer (creo, aunque has dado


poca información) de
una forma sencilla con un INSERT INTO SELECT. Y seguro


que irá mucho más
rápido.

Si es posible, enviamos más detalles del proceso, y pon


el script de código
que estás utilizando, así como el DDL de las tablas que


intervienen.


Un saludo
Salvador Ramos
Murcia - España
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows


DNA y .NET)

"MIKE" escribió en el


mensaje
news:025701c53b91$f2cf0f40$
Caso de RECORRER TABLA SQL.
Hola a todos.
Quiero saber si existe otra Forma de Recorrer una Tabla
SQL que tiene como 17 MIllones de Registros, la cual se
Recorre y linea a linea se llenan sus Datos a Otras 2
Tablas (Ya que están en Codigos que tienen diferentes
significados).
Estoy usando un DECLARE CURSOR-OPEN CURSOR,etc.
Pero el proceso me lleva como 7 u 8 horas.
Quiero saber si puedo mejorar esto o que otra forma puedo
usar.



Tengo una Tabla Principal que es la que Recorro, y dos
Tablas Secundarias una de Datos de Identidad y otra de
Saldos que lleno.



Este es una parte del Contenido de la Tabla Principal TP
que tiene un Solo Campo . Este se refiere a un Solo
Cliente



1E000428886620030430 120092920 1
0020344000000000000000006560NU#EZ TORRAS JOSE MARIO

2E0004288866001073141103060000000000000000004859340

2E0004288866001073841402290000000000000000004941900

2E0004288866001413142503060000007030000000009268704

2E0004288866001413142903010000000000000000009268704

2E0004288866001413812401000000000000000000001343154

2E0004288866001413842402090000000000000000007616404



Asi como este existen datos o lineas alrededor de 17
Millones,



Lo que Hago es usar un Proc Alm. En el que usao el
Declare Cursor , etc.



Por ejemplo , si la Cadena empieza con '1' son datos
para la Tabla Secundaria TS1 y si comienza con '2' para
la

Tabla Secundaria TS2.

El Nombre lo saco usando SUBSTRING, igual saco las
Cuentas Contables , su Codigo de Doc de Identidad, Nro de
Documento de Identidad,

Saldos, dias de atraso, Porcentajes de Calificación de
Riesgo.,etc



Es decir tomo cada Linea y tengo que desagregar datos y
enviarlos Bien a la Tabla Secundaria 1 o 2.



Ese es en Resumen el Problema.



Espero tu Amable ayuda o sugerencias


.





.

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