2009-05-29 45 views
5

Tengo un archivo csv y necesito importarlo a una tabla en sql 2005 o 2008. Los nombres de columna y el recuento en el csv son diferentes de los nombres de columna de la tabla y contar. El csv está dividido por un ';' .Usar bcp para importar un archivo csv a sql 2005 o 2008

Ejemplo

FILEcontents CSV:

Tabla
FirstName;LastName;Country;Age 
Roger;Mouthout;Belgium;55 

persona SQL

Columns: FName,LName,Country 
+0

¿Has mirado bcp.exe? – gbn

+0

¿Qué hace el mundo que este archivo sea un archivo CSV (valores separados por comas)? –

Respuesta

9

que crearía una tabla temporal, mayor insertar el lote, seleccione en la nueva tabla lo necesita y suelta la tabla temporal.

Algo así como

CREATE TABLE dbo.TempImport 
(
    FirstName varchar(255), 
    LastName varchar(255), 
    Country varchar(255), 
    Age varchar(255) 
) 
GO 
BULK INSERT dbo.TempImport FROM 'PathToMyTextFile' WITH (FIELDTERMINATOR = ';', ROWTERMINATOR = '\n') 
GO 
INSERT INTO dbo.ExistingTable 
(
    FName, 
    LName, 
    Country 
) 
SELECT FirstName, 
     LastName, 
     Country 
FROM  dbo.TempImport 
GO 
DROP TABLE dbo.TempImport 
GO 
+6

El título de pregunta era sobre cómo usar la herramienta BCP, no la inserción masiva, aunque esta podría ser la respuesta correcta para la mayoría de los casos, la inserción masiva presenta algunas limitaciones en el número de filas y campos que la herramienta bcp no. – bpatrao

+0

Aunque es obvio que hace bastante tiempo, el título de la pregunta puede mencionar bcp, pero el contenido de la pregunta simplemente pregunta cómo importarlo y, en segundo lugar, no hay limitaciones de fila o campo en BULK INSERT que no existan en BCP afaik –

+0

Hola Dan ! Si revisa la documentación oficial de Microsoft (http://msdn.microsoft.com/en-us/library/ms188365.aspx) indica claramente "Al usar un archivo de formato con BULK INSERT, puede especificar hasta 1024 campos solamente. Esto es igual que la cantidad máxima de columnas permitidas en una tabla. Si usa BULK INSERT con un archivo de datos que contiene más de 1024 campos, BULK INSERT genera el error 4822. La utilidad bcp no tiene esta limitación, por lo que para los archivos de datos que contienen más de 1024 campos, use el comando bcp ". Entiendo que este es un problema menor, pero solo para mantener a todos informados :) – bpatrao

8

Puede utilizar un archivo de formato al importar con BCP:

Crear un archivo de formato para su tabla:

bcp [table_name] format nul -f [format_file_name.fmt] -c -T 



9.0 
4 
1  SQLCHAR  0  100  ","  1  FName    SQL_Latin1_General_CP1_CI_AS 
2  SQLCHAR  0  100  ","  2  LName    SQL_Latin1_General_CP1_CI_AS 
3  SQLCHAR  0  100  ","  3  Country   SQL_Latin1_General_CP1_CI_AS 
4  SQLCHAR  0  100  "\r\n" 0  Age    SQL_Latin1_General_CP1_CI_AS 

Edite el archivo de importación. El truco consiste en agregar una fila ficticia para el campo que desea omitir, y agregar un '0' como orden de columnas del servidor.

continuación, importar los datos utilizando este archivo de formato, especificando el archivo de entrada, este archivo de formato y el separador:

bcp [table_name] in [data_file_name] -t , -f [format_file_name.fmt] -T 
3

ahora prefiero utilizar archivos de formato XML como este con BULK INSERT u OPENROWSET:

<?xml version="1.0"?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<RECORD> 
    <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="|" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
    <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="37"/> 
    <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="41"/> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="17"/> 
    <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="i" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="2" NAME="j" xsi:type="SQLUNIQUEID"/> 
    <COLUMN SOURCE="3" NAME="k" xsi:type="SQLNUMERIC" PRECISION="18" SCALE="0"/> 
    <COLUMN SOURCE="4" NAME="l" xsi:type="SQLBINARY"/> 
    <COLUMN SOURCE="5" NAME="m" xsi:type="SQLVARYCHAR"/> 
</ROW> 
</BCPFORMAT> 

continuación, puede utilizar el comando BULK INSERT del lado del servidor de la siguiente manera:

BULK INSERT foo FROM '\\mydomain.com\bar\bletch' WITH (FORMATFILE='foo.xml', ERRORFILE='foo.errors', FIRSTROW = 1, BATCHSIZE=10000) 

alternativamente, si desea modificar los datos 'en vuelo', puede usar

INSERT foo(i, j,k) 
SELECT foo_delimited.i, foo_delimited.j, foo_delimited.k * 2 
OPENROWSET(BULK 'foo', 
        FORMATFILE= 'foo.xml') 
     AS foo_delimited 
+0

Parece que no puedo obtener el XML para representar correctamente. Uno puede ver el XML sin procesar si edita la respuesta :-( –

Cuestiones relacionadas