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. :-)

Preguntas similare

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. :-)
Respuesta Responder a este mensaje
#2 Maxi
28/09/2005 - 02:54 | Informe spam
Hola, que hago yo generalmente

1) Creo una tabla intermedia
2) A esta tabla intermedia le agrego un trigger para Delete donde paso los
registros validos de una a la otra (aca podes hacer el check q quieras)
3) Borro de a pasos la tabla que cree en 1, con lo cual pasara los registros

Que logro con esto:

1) Solucionar tu problema desde el trigger
2) No matar al servidor con una carga muy grande :-)




Culminis SQL-Server Speakers (http://latam.culminis.com)

Maxi - Buenos Aires - Argentina
Msn_messager:
mail: Maxi.da[arroba]gmail.com

"Alejandro Mesa" escribió en el
mensaje news:
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. :-)
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida