Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

como leer un txt y grabar una tabla sql

1,865 views
Skip to first unread message

Claudio

unread,
Jul 11, 2008, 12:42:55 PM7/11/08
to
Hola grupo

tengo un txt, con los campos separados por "," , quiero ir leyendo esos
registros y
"cortando" c/campo ir grabando el campo equivalente de mi tabla. Puedo
hacerlo desde sql , es decir ir leyendo el txt e ir grabando la tabla, sin
usar BulkInsert o el bcp ??, porque con ambas opciones me encuentro con
limitacion como el formato del archivo.

gracias
Salu2

--
Claudio
"El hombre se hace viejo muy pronto,....... y sabio, demasiado tarde."


Gustavo Larriera (MVP)

unread,
Jul 11, 2008, 1:03:03 PM7/11/08
to
Puede usar Data Integration Services (SS2000) o Integration Services (SS2005)
para resolver ese tipo de problemas. También puede hacer un programa que haga
la tarea, si usted es de los que se sienten cómodos programando.

Personalmente no intentaría usar T-SQL para hacer ese tipo de cosas.

--
Gustavo Larriera, Microsoft MVP
http://www.linkedin.com/in/gustavolarriera
--
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.

Claudio

unread,
Jul 11, 2008, 1:43:48 PM7/11/08
to
Hola Gustavo,

mi intencion es resolverlo a traves de un Store, porque lo tengo hecho en
codigo
de VB6, pero es tan lento en procesar todos los registros (1.346.400) , lo
hago con ADO, abriendo el txt con Output ... for input... y luego cortando
los campos y grabando mi tabla, que por ello intento solucionarlo de otra
forma que sea mas agil.
Igual, gracias por la rta.

Claudio

"Gustavo Larriera (MVP)" <GustavoLa...@discussions.microsoft.com>
escribió en el mensaje
news:D4EA2803-7890-4217...@microsoft.com...

Gustavo Larriera (MVP)

unread,
Jul 11, 2008, 2:15:02 PM7/11/08
to
Si las lineas del texto son uniformes en cantidad de campos, usar BCP, BULK
INSERT o los Data Transformation Services es una buena opción.

Si las líneas son de formato variable, le sugiero lo siguiente: Primero
resuelva el paso de insertar todas las líneas de texto a filas de una tabla
(por ejemplo use BCP o BULK INSERT).

No se preocupe ahora por el formato de los datos, lea cada linea e insértela
tal cual en una tabla que tenga una columna para alojar la linea, cada linea
será una fila de la tabla).

Luego sí, programe un stored procedure que procese cada fila de la tabla y
obtenga los datos que están en la línea separados por comas. Un cursor puede
ser adecuado para su problema.

Claudio

unread,
Jul 11, 2008, 2:28:00 PM7/11/08
to
esa opcion me gusto mas, importar a una tabla y luego si , hacer codigo sql
para leer
dicha tabla y grabar la tabla necesaria. Lo pruebo y te aviso como me fue.

gracias
Claudio

"Gustavo Larriera (MVP)" <GustavoLa...@discussions.microsoft.com>
escribió en el mensaje

news:93DCAC3E-BE33-4616...@microsoft.com...

Salvador Ramos

unread,
Jul 11, 2008, 5:52:22 PM7/11/08
to
De todas formas no dejes de mirar BCP y BULK INSERT como te indicó Gux,
posiblemente te ahorres esa tabla intermedia.

--
Un saludo
Salvador Ramos
Solid Quality Mentors (http://www.solidq.com)
---------------------------------------------------
www.helpdna.net (información sobre SQL Server y Microsoft .Net)
Visita mi nuevo blog: www.sqlserversi.com
---------------------------------------------------

"Claudio" <ccar...@acofarazul.com.ar> escribió en el mensaje
news:%23y6MGQ4...@TK2MSFTNGP03.phx.gbl...

Claudio

unread,
Jul 12, 2008, 8:58:18 AM7/12/08
to
Ok, estoy tratando de resolverlo con el Bulk y programacion directamente.
Sin la tabla intermedia. Ni bien funcione, les comento como quedo.

Gracias
Claudio

"Salvador Ramos" <webmaster...@YEstoHelpdna.net> escribió en el
mensaje news:%23vx3cB6...@TK2MSFTNGP04.phx.gbl...

Claudio

unread,
Jul 14, 2008, 1:22:52 PM7/14/08
to
Hola
 
si bien no pude hacer directamente desde SQl la lectura de un txt y grabar una tabla,  pude solucionar el problema, reduciendo de 4 (o 5) horas  el proceso de actualizacion a 2 minutos. Lo que hago es cargar mi TXT en una tabla temporal  y luego desde alli actualizo realmente la tabla en cuestion. Lo resolvi "medio casero" pero funciona bien. Les paso como me quedo el script :
 
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PruebaRentas]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
  drop table PruebaRentas
go
 
CREATE TABLE [dbo].[PruebaRentas] (
 [renglon] [char] (60) COLLATE Modern_Spanish_CI_AS NOT NULL ,
  ) ON [PRIMARY]
GO
 
truncate table rentas_pad_ret_per
 
bulk insert pruebarentas
from 'c:\rentas\padron.txt'
with
    (
     fieldterminator =';',
     rowterminator ='\n'
    )
 
insert into Rentas_pad_ret_per
(
   fecha_de_publicacion,
   fecha_vigencia_desde,
   fecha_vigencia_hasta,
   numero_cuit,
   tipo_contr_insc,
   marca_alta_baja_sujeto,
   marca_cbio_alicuota,
   alicuota_percepcion,
   alicuota_retencion,
   nro_grupo_percepcion,
   nro_grupo_retencion
)
(select
--  CONVERT(CHAR(02), substring(pruebarentas.renglon,1,2))+'/'+ CONVERT(CHAR(02), substring(pruebarentas.renglon,4,2)) + '/' + CONVERT(CHAR(04), substring(pruebarentas.renglon,5,4)) + ' 00:00:00'  as fecha_de_publicacion,
  CONVERT(datetime, convert(char(4),substring(pruebarentas.renglon,5,4))+'-'+ CONVERT(CHAR(02), substring(pruebarentas.renglon,3,2)) + '-' + CONVERT(CHAR(02), substring(pruebarentas.renglon,1,2)) + ' 00:00:00',102)  as fecha_de_publicacion,
  CONVERT(datetime, convert(char(4),substring(pruebarentas.renglon,14,4))+'-'+ CONVERT(CHAR(02), substring(pruebarentas.renglon,12,2)) + '-' + CONVERT(CHAR(02), substring(pruebarentas.renglon,10,2)) + ' 00:00:00',102) as fecha_vigencia_desde,
  CONVERT(datetime, convert(char(4),substring(pruebarentas.renglon,23,4))+'-'+ CONVERT(CHAR(02), substring(pruebarentas.renglon,21,2)) + '-' + CONVERT(CHAR(02), substring(pruebarentas.renglon,19,2)) + ' 00:00:00',102) as fecha_vigencia_hasta,
  cast(substring(pruebarentas.renglon,28,11) as varchar(11)) as numero_cuit,
  substring(pruebarentas.renglon,40,1) as tipo_contr_insc,
  substring(pruebarentas.renglon,42,1) as marca_alta_baja_sujeto,
  substring(pruebarentas.renglon,44,1) as marca_cbio_alicuota,
  convert(money,replace(substring(pruebarentas.renglon,46,4),',','.')) as alicuota_percepcion,
  convert(money,replace(substring(pruebarentas.renglon,51,4),',','.')) as alicuota_retencion,
  convert(varchar(2),substring(pruebarentas.renglon,56,2)) as nro_grupo_percepcion,
  convert(varchar(2),substring(pruebarentas.renglon,59,2)) as nro_grupo_retencion
 
from pruebarentas)
go
 
Salu2 y gracias por las ayudas para solucionar el pb.

Gustavo Larriera (MVP)

unread,
Jul 14, 2008, 2:07:00 PM7/14/08
to
Bajar 4 horas a 2 minutos es un excelente número.
Gracias Claudio por compartir la solución.

--
Gustavo Larriera, Microsoft MVP
http://www.linkedin.com/in/gustavolarriera
--
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.

0 new messages