Problema importación datos incrementales.

27/12/2006 - 12:42 por Salvador Ramos | Informe spam
Hola a todos,

Tengo una tabla origen en la cual no tengo PK, y cuento con algunas
repetidas (filas totalmente iguales, con el mismo valor en todas sus
columnas:

CREATE TABLE [dbo].[avlValec](
[Empresa] [int] NULL,
[cliente] [int] NULL,
[tipo_fact] [char](2) COLLATE Modern_Spanish_CI_AS NULL,
[num_tarjeta] [char](19) COLLATE Modern_Spanish_CI_AS NULL,
[fecha] [smalldatetime] NULL,
[num_mvto] [varchar](10) COLLATE Modern_Spanish_CI_AS NULL,
[cod_articulo] [varchar](8) COLLATE Modern_Spanish_CI_AS NULL,
[denominacion] [varchar](40) COLLATE Modern_Spanish_CI_AS NULL,
[pvp_iva] [decimal](8, 3) NULL,
[tipo_dto] [char](1) COLLATE Modern_Spanish_CI_AS NULL,
[canti] [decimal](8, 2) NULL,
[importe_vale] [decimal](8, 2) NULL,
[impor_dto] [decimal](7, 2) NULL,
[dto] [decimal](6, 3) NULL,
[iva] [decimal](3, 1) NULL,
[codigo_esta] [int] NULL,
[hora] [varchar](4) COLLATE Modern_Spanish_CI_AS NULL,
[matricula] [char](10) COLLATE Modern_Spanish_CI_AS NULL,
[fecha_factu] [smalldatetime] NULL,
[num_factu] [varchar](10) COLLATE Modern_Spanish_CI_AS NULL,
[facturado] [char](1) COLLATE Modern_Spanish_CI_AS NULL,
[contab] [char](1) COLLATE Modern_Spanish_CI_AS NULL
) ON [PRIMARY]

Y otra tabla destino en la que tengo que insertar filas desde la tabla
origen anterior. Esta tabla contiene algunas columnas procedentes de la
tabla anterior (no todas).

CREATE TABLE [dbo].[andGasoleoProfMov](
[IdMovCont] [char](21) COLLATE Modern_Spanish_CI_AS NOT NULL,
[CIM] [char](8) COLLATE Modern_Spanish_CI_AS NOT NULL,
[Fecha] [datetime] NOT NULL,
[Hora] [char](4) COLLATE Modern_Spanish_CI_AS NOT NULL,
[CodPro] [char](3) COLLATE Modern_Spanish_CI_AS NOT NULL,
[Lit] [decimal](7, 2) NOT NULL,
[NIF] [char](9) COLLATE Modern_Spanish_CI_AS NOT NULL,
[Matricula] [varchar](12) COLLATE Modern_Spanish_CI_AS NOT NULL,
[Estado] [char](1) COLLATE Modern_Spanish_CI_AS NOT NULL,
[Fichero] [varchar](50) COLLATE Modern_Spanish_CI_AS NOT NULL,
[FechaAudit] [datetime] NOT NULL,
[Empresa] [int] NOT NULL,
CONSTRAINT [PK_andGasoleoProfMov] PRIMARY KEY CLUSTERED
(
[IdMovCont] ASC
) ON [PRIMARY]
) ON [PRIMARY]

Las columnas Estado, Fichero y FechaAudit al importar los datos quedan en
blanco y posteriormente las actualizan otros procesos.

Necesito realizar un proceso periódico para la importación de datos nuevos
en la tabla andGasoleoProfMov, pero al no tener PK la tabla de origen y
tener filas totalmente idénticas, me dan problemas todas las soluciones que
se me han ocurrido, y no consigo hacerlo.
No es posible poner una PK a la tabla origen, ya que es una tabla de mi ERP
de la cual sólo puedo leer datos, en ningún caso modificar su estructura.
Algunos de los datos de la tabla destino salen de otras tablas, pero no he
querido complicarlo aquí, ya que puedo hacer join a ellas y obtenerlos sin
ningún problema.

Si se os ocurre alguna solución, os estaré muy agradecido, ya que pretendo
solucionar un problema importante para mi emrpresa, y además voy
contrareloj, tenía que estar hecho para ayer :-(

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)

Preguntas similare

Leer las respuestas

#11 Salvador Ramos
29/12/2006 - 17:34 | Informe spam
Muchas gracias Alejandro,

El martes en cuanto llegue a la oficina y retome los temas reviso lo que me
indicas. Precisamente por ahí estoy trabajando la solución, y Miguel Egea
también me habló del artículo de Itzik.

La verdad que si es gran lío, pero todo viene de que realmente el ERP
funciona con los antiguos y obsoletos ficheros btrieve. Gracias a que
evolucionó a Pervasive SQL y tengo un proveedor ole db, puedo acceder en
modo sólo lectura a dichos datos y extraerlos. Pero claro, todo está
diseñado con la filosofía obsoleta de ficheros y punteros a registros,
incluso me han argumentado que cuando necesitan clave única, desde la
aplicación utilizan un número interno de registro (es algo propio de btrieve
y a lo que no tengo acceso). :-(

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)


"Alejandro Mesa" escribió en el
mensaje news:
Mostrar la cita
#12 Salvador Ramos
02/01/2007 - 18:23 | Informe spam
Muchas gracias Alejandro,

Tras estudiar la solución la he descartado, ya que en la tabla destino si
que necesito tener una Primary Key. Lo que estoy haciendo importar todos los
datos a una tabla temporal, en la que tengo dos nuevas columnas (PK1 y Pk2),
PK1 va a ser un campo de char de muchos caracteres, tantos como la suma de
las columnas con las que pueda conseguir filas "casi" únicas, y luego PK2
será un contador que numere las filas (en la mayoría tendrá el valor 1, y
cuando se obtengan duplicados en PK1 irá sumandole, por ejemplo, si en un
valor de PK1 encuentra 3 duplicados, PK2 tendrá los valores 1, 2 y 3).
Esta tabla pretendo cada vez que lance el proceso hacer un TRUNCATE TABLE y
cargarla de nuevo, de ahí la importancia de que siempre me devuelva el mismo
PK1 para una misma fila (el PK2 al ser idénticas me da igual, sólo lo quiero
para tener valores únicos).
No es una buena solución, pero como el rendimiento no me preocupa en
absoluto (se realizará durante la noche, cuando no hay nadie trabajando con
la base de datos. Lo que si que me preocupa es que el valor de la PK para
una fila que me de hoy sea el mismo que me de en días sucesivos.

Luego ya, partiendo de esta tabla temporal (con PK) importaré las filas que
no existan a la tabla destino.

Se admiten todo tipo de sugerencias :-)

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)


"Alejandro Mesa" escribió en el
mensaje news:
Mostrar la cita
#13 Salvador Ramos
03/01/2007 - 22:56 | Informe spam
Finalmente, tras encontrarme con muchos problemas, he optado por una
solución basada en un cursor, que recorre las filas duplicadas y va
modificando los dos últimos caracteres de la clave, que son el contador
utilizado para diferenciar unas filas de otras iguales. Este es el script:

vaya
el cursor
fila a fila
declare @Id int, @PK char(75), @PKant char(75), @dup int
declare CurDuplicados cursor local forward_only
for select Id, PK
from tmpGasoleoProf01
where PK in(select PK from dbo.tmpGasoleoProf01
group by PK having count(*) > 1)
order by PK
open CurDuplicados
fetch next from CurDuplicados into @Id, @PK
while @@fetch_status = 0 begin
set @PKant = @PK
set @dup = 0
while @@fetch_status = 0 and @PK = @PKant begin
set @dup = @dup + 1
update tmpGasoleoProf01
set PK = left(@PK, 73) + right(rtrim('00' + cast(@dup as char(2))), 2)
where current of CurDuplicados
fetch next from CurDuplicados into @Id, @PK
end
end
close CurDuplicados
deallocate CurDuplicados

Creo además que es una solución bastante óptima, ya que suelo tener unas 3
filas repetidas en cada 1000, por lo que los datos a actualizar serán muy
pocos.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)


"Salvador Ramos" escribió en el
mensaje news:%
Mostrar la cita
Ads by Google
Search Busqueda sugerida