problema al importar datos con BCP en una tabla con restricciones

27/09/2005 - 21:39 por borix rios | Informe spam
Hola a todos:
Estoy realizando un script de importacion de datos desde archivos planos a
una tabla de la base datos, esto realizado con la herramienta BCP, pero
cuando intento cargar un lote en el cual existen tanto registro nuevos para
la tabla como tambien registros que ya existian BCP se detiene por el error
de duplicacion de campos claves, y no continua revisando las demas lineas del
archivo

Cabe mencionar que este script debera permitir importar cualquier tabla de
la base de datos.

la instruccion es la sgte:
execute master.dbo.xp_cmdshell 'BCP DB.DBO.tabla IN C:\TABLA.TXT -m 10000 -e
C:\ERR.TXT'

Les agradeceria emormente si me ayudan a solucionar este dilema. :-)
 

Leer las respuestas

#1 Alejandro Mesa
27/09/2005 - 22:28 | Informe spam
Podriamos ver dos posibles soluciones.

1 - Usando una tabla similar a la que vas a insertar las filas provenientes
del archivo txt y luego usar esta tabla en una sentencia "insert"

select *
into tmp_tbl
from tabla
where 0 = 1

execute master.dbo.xp_cmdshell 'BCP DB.DBO.tmp_tbl IN C:\TABLA.TXT -m 10000
-e C:\ERR.TXT'

insert into tabla
select *
from tmp_tbl
where not exists (
select * from tabla where tabla.pk = tmp_tbl.pk
)

drop table tmp_tbl
go

2 - En vez de declarar una restriccion de clave primaria, podemos (no es lo
optimo) crear un indice unico clustered o nonclustered con la opcion de
indice IGNORE_DUP_KEY.

Ejemplo:

use northwind
go

exec master.dbo.xp_cmdshell 'bcp "select top 10 orderid from
northwind.dbo.orders order by orderid asc" queryout "c:\temp\orders_1.txt"
-Smi_server -T -c', no_output
exec master.dbo.xp_cmdshell 'bcp "select orderid from northwind.dbo.orders"
queryout "c:\temp\orders_2.txt" -Smi_server -T -c', no_output
go

select cast(orderid as int) as orderid
into dbo.new_orders
from dbo.orders
where 0 = 1
go

create unique clustered index ix_u_c_new_orders_orderid on
dbo.new_orders(orderid asc)
with IGNORE_DUP_KEY
go

exec master.dbo.xp_cmdshell 'bcp "northwind.dbo.new_orders" in
"c:\temp\orders_1.txt" -Smi_server -T -c', no_output
exec master.dbo.xp_cmdshell 'bcp "northwind.dbo.new_orders" in
"c:\temp\orders_2.txt" -Smi_server -T -c', no_output
go

select count(*)
from new_orders
go

drop table dbo.new_orders
go

exec master.dbo.xp_cmdshell 'del "c:\temp\orders_1.txt"', no_output
exec master.dbo.xp_cmdshell 'del "c:\temp\orders_2.txt"', no_output
go


AMB

"borix rios" wrote:

Hola a todos:
Estoy realizando un script de importacion de datos desde archivos planos a
una tabla de la base datos, esto realizado con la herramienta BCP, pero
cuando intento cargar un lote en el cual existen tanto registro nuevos para
la tabla como tambien registros que ya existian BCP se detiene por el error
de duplicacion de campos claves, y no continua revisando las demas lineas del
archivo

Cabe mencionar que este script debera permitir importar cualquier tabla de
la base de datos.

la instruccion es la sgte:
execute master.dbo.xp_cmdshell 'BCP DB.DBO.tabla IN C:\TABLA.TXT -m 10000 -e
C:\ERR.TXT'

Les agradeceria emormente si me ayudan a solucionar este dilema. :-)

Preguntas similares