Pregunta

Estoy tratando de importar algunos datos a SQL Server 2008 por medio de inserción masiva, pero he estado recibiendo un montón de errores de conversión:

MSG 4864, Nivel 16, Estado 1, Línea 1 Error de conversión de datos de carga a granel (tipo desajuste o carácter no válido para la etiqueta de códigos especificada) para la fila 5902, columna 2 (tipo).

Ok, lo primero es lo primero:

a) Los datos provienen de un analizador que construí en C#. En este archivo, hay 4 columnas, separadas por pestañas. Las columnas pueden o no ser nulas. La recopilación es UTF-8. Aquí hay un extracto de ello.

D00486  DBLinks PubChem 7847552
D00486  DBLinks LigandBox   D00486
**D00487    Name        Pyridostigmine bromide (JP15/USP/INN)** -- WORKS
D00487  Name        Mestinon (TN)
D00487  Chemical    260.016 C9H13N2O2. Br
D00487  Target  PATH:hsa00564(43)
D00487  Remark      Therapeutic category: 1239
D00487  Remark      ATC code: N07AA02
D00487  Pathway PATH: map07220  Cholinergic and anticholinergic drugs
D00487  DBLinks CAS 101-26-8
D00487  DBLinks PubChem 7847553
D00487  DBLinks DrugBank    DB00545
D00487  DBLinks LigandBox   D00487
**D00488    Name        Pyrimethamine (JAN/USP/INN)** -- DOES **NOT** WORK!
D00488  Name        Daraprim (TN)

La segunda en la última fila genera un mensaje de error como el que le he mostrado anteriormente. Lo que realmente me sorprende es que la otra línea que he puesto en Bold es bastante similar pero no genera ningún error.

b) Esto es lo que estoy usando para crear la tabla:

CREATE TABLE [dbo].[KB] ([BEName] [nvarchar](1000) NOT NULL, [Type] [nvarchar](1000) NULL, [Name] [nvarchar](1000) NULL, [Value] [nvarchar](1000) NULL) ON [PRIMARY]

c) Esto es lo que estoy usando actualmente para importar los datos de un archivo:

DECLARE @SQL nvarchar(4000)
SET @SQL = 'BULK INSERT KB FROM ''C:\KB.xml'' WITH (FirstRow = 1, FORMATFILE = ''C:\out_KB.fmt'')';
EXEC(@SQL)

Tuve que generar manualmente el archivo FMT porque por alguna razón BCP no pudo conectarse a mi base de datos (todavía resuelve los conceptos básicos en él ...), por lo que es posible que no sea como debería ser. De cualquier manera, aquí están su contenido:

9.0
4
1 SQLCHAR 0 100 "" 1 BEName SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 500 "\t" 2 Type SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 500 "\t" 3 Name SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 500 "\n" 9 Value SQL_Latin1_General_CP1_CI_AS

Como he dicho anteriormente, no tengo mucha experiencia con BCP; Inicialmente, simplemente estaba usando

BULK INSERT KB FROM ''C:\KB.xml'' WITH (FirstRow = 1, RowTerminator = ''\n'' , FieldTerminator = ''\t'')

Pero no funcionaría de todos modos. Todavía prefiero usar esto en lugar del archivo FMT; Busqué en Google y probé un par de trucos (como intercambiar n con n cr o introducir el código ASCII del n en su lugar).

¿Algunas ideas? No puedo decir que tenga, estoy exhausto en este momento, voy a dormir hasta el mediodía o algo así: S (son las 4 am aquí ahora).

Saludos compañeros, gracias y avance hal

PD: Creo que las muestras están bien, pero sea mi invitado y solicite lo que pueda necesitar en cualquier momento. PS2: Perdón por la pared del texto;)

¿Fue útil?

Solución

Los archivos de inserción a granel que no son XML son muy quisquillosos. Miré el tuyo y no veo un problema, pero es fácil perder los problemas.

Los archivos de inserción a granel XML son mucho más fáciles de trabajar. ¿Puede refactorizar su código para producir archivos de inserción a granel XML? También he descubierto que también debe usar archivos de formato XML al usar archivos de inserción XML, y BCP no creará eso para usted; debe escribir su archivo de formato XML usted mismo, pero es bastante fácil.

Otros consejos

Hilo antiguo, pero para el registro, creo que el problema fue con el archivo de formato de OP. No especifica un delimitador para la primera fila. Debería ser:

9.0
4
1 SQLCHAR 0 100 **"\t"** 1 BEName SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 500 "\t" 2 Type SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 500 "\t" 3 Name SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 500 "\n" 9 Value SQL_Latin1_General_CP1_CI_AS

...sin que los asteriscos.

Los archivos de Windows Systems generalmente necesitarán " r n" para el terminador final.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top