15

Estoy buscando una forma rápida y sucia de importar archivos CSV en SQL Server sin tener que crear la tabla de antemano y definir sus columnas.¿Cómo crear y completar una tabla en un solo paso como parte de una operación de importación de CSV?

Cada CSV importado se importaría a su propia tabla.

No nos preocupa la información de tipo de datos. Los CSV varían en estructura y diseño, y todos ellos tienen muchas columnas, pero solo nos interesan algunos de ellos: direcciones de calles y códigos postales. Solo queremos obtener los datos CSV en la base de datos SQL rápidamente y extraer las columnas relevantes.

Me gustaría proporcionar FieldTerminator y RowTerminator, señalarlo en el archivo CSV y hacer que la utilidad se encargue del resto. ¿Hay alguna forma de crear la tabla y completarla, todo en un solo paso, usando BULK INSERT y/o OpenRowset (BULK ...)?

+0

¿Qué versión de SQL Server? –

+0

Sql Server 2000 – Tim

Respuesta

11

Referencing SQLServerPedia, creo que esto va a funcionar:

sp_configure 'show advanced options', 1; 
RECONFIGURE; 
GO 
sp_configure 'Ad Hoc Distributed Queries', 1; 
RECONFIGURE; 
GO 

select TerritoryID 
     ,TotalSales 
     ,TotalCost 
INTO CSVImportTable 
from openrowset('MSDASQL' 
       ,'Driver={Microsoft Access Text Driver (*.txt, *.csv)}' 
       ,'select * from C:\csvtest.CSV') 
+0

Gracias. Tuve que usar Microsoft Text Driver en lugar de Microsoft Access Text Driver, pero la importación funcionó. Sin embargo, recibí este mensaje de error (aunque la importación funcionó a pesar de ello): Msg 15123, nivel 16, estado 1, procedimiento sp_configure, línea 79 La opción de configuración 'Consultas distribuidas ad hoc' no existe o puede ser una versión avanzada opción. – Tim

+0

Debe ejecutar 'RECONFIGURE' para las opciones avanzadas antes de poder configurar la opción ad-hoc. Debería haber otro IR después de la primera RECONFIGURA. Voy a volver a editar. – TyT

5

molesto, no tengo los puntos rep todavía acaba de comentar, así que voy a añadir una respuesta basada en TyT de (mango que se ve terrible en posesivo, por cierto ...)

El código de trabajador necesitaba un doble "\" en lugar de uno solo para evitar un error de "archivo no encontrado". Y no tienes que especificar los campos; se deducirán de la primera fila del archivo:

select * 
into CsvImportTable 
from openrowset(
      'MSDASQL', 
      'Driver={Microsoft Access Text Driver (*.txt, *.csv)}', 
      'select * from C:\\csvtestfile.csv') 

No tuve problemas con el controlador de acceso.

ACTUALIZACIÓN: Si tiene problemas con los tipos que se deducen incorrectamente, inserte unas pocas filas en la parte superior del archivo con datos del tipo que desea en la tabla para obtener, digamos texto -> VARCHAR en lugar de texto- > INT y luego borre esas filas después de la importación.

Como la guinda final, añadir un PK a la mesa para que pueda manipular los datos - eliminar las filas ficticias, etc:

alter table CsvImportTable add Id int identity(1, 1) 
+1

Por lo que vale, agregando los detalles a su perfil. Tus puntos de representación aumentan. –

Cuestiones relacionadas