sql-server bulkinsert spatial

Inserción masiva con calificador de texto en SQL Server



sql-server bulkinsert (4)

Estoy tratando de bulk insert algunos registros en una prueba de tabla desde un archivo CSV,

CREATE TABLE Level2_import (wkt varchar(max), area VARCHAR(40), ) BULK INSERT level2_import FROM ''D:/test.csv'' WITH ( FIRSTROW = 2, FIELDTERMINATOR = '','', ROWTERMINATOR = ''/n'' )

El código de inserción masiva debe eliminar la primera fila e insertar los datos en la tabla. se deshace de la primera fila, pero se confunde en la sección delimitador. La primera columna es wkt y el valor de la columna está entre comillas dobles y tiene una coma dentro del valor.

Entonces, supongo que la pregunta es si hay una manera de decirle al BULK INSERT que la parte doblemente citada es una columna, independientemente de la coma que contenga.

el archivo CSV se ve así,

"MULTIPOLYGON (((60851.286135090661 510590.66974495345,60696.086128673756 510580.56976811233,60614.7860844061 510579.36978015327,60551.486015895614)))", 123123.22


Debe usar un ''archivo de formato'' para implementar un calificador de texto para la inserción masiva. Esencialmente, necesitará enseñarle al inserto masivo que hay delimitadores potencialmente diferentes en cada campo.

Cree un archivo de texto llamado "level_2.fmt" y guárdelo.

11.0 2 1 SQLCHAR 0 8000 "/"," 1 wkt SQL_Latin1_General_CP1_CI_AS 2 SQLCHAR 0 40 "/r/n" 2 area SQL_Latin1_General_CP1_CI_AS

La primera línea, "11.0" se refiere a su versión de SQL. La segunda línea muestra que su tabla, [level2_import], tiene dos columnas. Cada línea después de eso describirá una columna y obedecerá el siguiente formato:

[Número de columna de origen] [Tipo de datos] [Tamaño mínimo] [Tamaño máximo] [Patrón delimitador] [Número de columna de destino] [Nombre de columna de destino] [Sensibilidad a mayúsculas y minúsculas de la base de datos]

Una vez que haya creado ese archivo, puede leer sus datos con la siguiente declaración de inserción masiva:

BULK INSERT level2_import FROM ''D:/test.csv'' WITH ( FIRSTROW = 2, FORMATFILE=''D:/level_2.fmt'' );

Consulte este blog para obtener una explicación detallada del archivo de formato.


Intente eliminar .fmt en el archivo y use .txt en su lugar, eso funcionó para mí


SQL Server 2017 finalmente agregó soporte para calificadores de texto y el formato CSV definido en RFC 4180. Debería ser suficiente para escribir:

BULK INSERT level2_import FROM ''D:/test.csv'' WITH ( FORMAT = ''CSV'', ROWTERMINATOR = ''/n'', FIRSTROW = 2 )


Tengo este problema al trabajar con datos LDAP, el dn contiene comas, al igual que otros campos que contienen dns. Intente cambiar su terminador de campo a otro carácter no utilizado, como una tubería | o punto y coma; Haga esto en los datos y la definición del archivo.

entonces el código debería ser:

CREATE TABLE Level2_import (wkt varchar(max), area VARCHAR(40), ) BULK INSERT level2_import FROM ''D:/test.csv'' WITH ( FIRSTROW = 2, FIELDTERMINATOR = '';'', ROWTERMINATOR = ''/n'' )

y tu CSV:

"MULTIPOLYGON (((60851.286135090661 510590.66974495345,60696.086128673756 510580.56976811233,60614.7860844061 510579.36978015327,60551.486015895614)))"; 123123.22