sql-server - migrar - restaurar base de datos sql server 2008 a 2012
¿Cómo solucionar el problema del calificador de texto incrustado al exportar datos a un archivo plano CSV? (3)
A menudo, el nombre y el apellido están en el mismo campo y formateados (Apellido, Primero). Esto debe ser texto calificado si está utilizando Tareas-> Exportar datos directamente desde la base de datos (no a través de SSIS donde tiene más opciones) y necesita exportar a CSV como archivo delimitado por comas.
Esto ayudará en sus campos seleccionados que no son nulos y necesitan una cotización doble ...
CASE WHEN NOT PersonName IS NULL AND LEN(PersonName) > 0 THEN QUOTENAME(PersonName, ''"'') ELSE NULL END as ''PersonName''
Resultado:
PersonName
"COLLINS, ZACKERY E"
RFC 4180:
RFC 4180 define Common Format and MIME Type for Comma-Separated Values (CSV) Files
. Uno de los requisitos del RFC 4180
se establece a continuación. Este es el punto #7
en el enlace RFC.
If double-quotes are used to enclose fields, then a double-quote
appearing inside a field must be escaped by preceding it with
another double quote. For example:
"aaa","b""bb","ccc"
SQL Server 2000:
DTS Export/Import Wizard
en SQL Server 2000
parece ajustarse a los estándares mencionados anteriormente, aunque el propio RFC 4180 parece haber sido publicado solo en octubre de 2005 . Estoy usando la versión de SQL Server 2000 que se indica a continuación.
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)
May 3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation
Standard Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
SQL Server 2012:
SQL Server Import and Export Wizard
de SQL Server 2012
en SQL Server 2012
no exporta los datos de la tabla al archivo CSV según el estándar definido en RFC 4180. Estoy utilizando la versión de SQL Server 2012 que se indica a continuación.
Microsoft SQL Server 2012 - 11.0.2316.0 (X64)
Apr 6 2012 03:20:55
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
Simulación de problemas:
Aquí hay un ejemplo que ejecuté en SQL Server 2000 y SQL Server 2012 . Ejecuté la consulta siguiente para crear una tabla e insertar algunos registros. La columna ItemDesc
tiene datos con comillas dobles. Mi intención es exportar los datos de ambas versiones de SQL Server utilizando su asistente integrado de exportación de datos y comparar los archivos CSV generados.
CREATE TABLE dbo.ItemInformation(
ItemId nvarchar(20) NOT NULL,
ItemDesc nvarchar(100) NOT NULL
)
GO
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES (''100338754'', ''Crown Bolt 3/8"-16 x 1" Stainless-Steel Hex Bolt'');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES (''202255836'', ''Simpson Strong-Tie 5/8" SSTB Anchot Bolt'');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES (''100171631'', ''Grip-Rite #11 x 1-1/2" Electro-Galvanized Steel Roofing Nails'');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES (''202210289'', ''Crown Bolt 1/2" x 3" "Zinc-Plated" Universal Clevis Pin'');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES (''100136988'', ''Tapcon 3/16" x 1-3/4" Climaseal Steel "Flat-Head" Phillips Concrete Anchors (75-Pack)'');
INSERT INTO dbo.ItemInformation (ItemId, ItemDesc) VALUES (''203722101'', ''KwikTap 3/16" x 2-1/4" "Flat-Head" Concrete Screws (100-Pack)'');
GO
En el DTS Export/Import Wizard
en SQL Server 2000
, utilicé las siguientes configuraciones para exportar los datos al archivo CSV. Guardé el archivo bajo el nombre SQLServer2000_ItemInformation.csv
.
En el SQL Server Import and Export Wizard
de SQL Server 2012
en SQL Server 2012
, utilicé las siguientes configuraciones para exportar los datos al archivo CSV. Guardé el archivo bajo el nombre SQLServer2012_ItemInformation.csv
.
Aquí está la comparación entre los dos archivos que usan Beyond Compare. El lado izquierdo contiene el archivo generado por SQL Server 2000
y el lado derecho contiene el archivo generado por SQL Server 2012
. Puede observar que el archivo del lado izquierdo de SQL Server 2000
contiene comillas dobles adicionales para compensar las comillas incrustadas en la columna de datos. Esto se ajusta al estándar especificado en RFC 4180
pero claramente falta en el archivo generado por SQL Server 2012
Búsquedas en la web:
Busqué este error en la web y encontré los siguientes enlaces. Los siguientes son los informes de errores en Microsoft Connect. Todos estos problemas parecen estar relacionados con la importación de un archivo, pero no con la exportación de datos. Todos estos errores se han cerrado como Fixed
.
- El analizador de archivos planos de SSIS no lee los delimitadores de columnas incrustados en los datos de texto
- El Administrador de conexión de archivos planos no maneja los delimitadores de texto en archivos CSV
- Las comillas incorporadas en la importación de archivos planos fallan
- ERROR: Administrador de conexión de archivos sin formato: el calificador de texto de varios caracteres no carga todos los datos
Debajo de la publicación en MSDN blog indica que los cambios se han realizado en SQL Server 2012 con respecto a Flat file source supports embedded qualifiers and a variable number of columns per row
Otra publicación en MSDN blog indica lo mismo en la sección Embedded Qualifiers
.
Solución alternativa que conozco:
Conozco una solución para solucionar el problema escribiendo una consulta que reemplazaría todas las comillas dobles ( "
) en los datos de mi columna con dos comillas dobles ( ""
) para que el archivo exportado termine con los datos del calificador integrado correcto. Evitaría extraer los datos directamente de la mesa tal como están.
Mis preguntas:
No sé si este problema realmente se ha solucionado en
SQL Server 2012
. ¿Se ha solucionado este problema solo paraimporting
archivos que tienen calificadores de texto incrustados ynot
paraexporting
datos a CSV?Probablemente, claramente estoy haciendo algo mal y echo de menos lo obvio. ¿Podría alguien por favor explicarme qué estoy haciendo mal aquí?
Microsoft Connect:
He enviado un informe de error en el sitio web de Microsoft Connect para obtener sus comentarios. Aquí está el enlace al informe de error. Si acepta que esto es un error, visite el siguiente enlace para votar en el sitio web de Microsoft Connect
.
El calificador de texto incrustado durante la exportación a CSV no cumple con RFC 4180
No le ofrecería esta respuesta, excepto que trabajaste tan duro para documentarla y se ha votado a favor sin respuesta después de un mes. Entonces, aquí va. Sus únicas opciones parecen ser cambiar los datos o cambiar la herramienta.
Probablemente, claramente estoy haciendo algo mal y echo de menos lo obvio. ¿Podría alguien por favor explicarme qué estoy haciendo mal aquí?
Cuando la herramienta se rompe y al vendedor no le importa, es un error seguir intentándolo. Es hora de cambiar. Se esfuerza mucho en investigar exactamente cómo se rompe y demostrar que viola no solo el RFC, sino también la versión anterior de la herramienta. ¿Cuánta más evidencia necesitas?
CSV es un ancla de barco también. Si tiene la opción, es mejor utilizar un formato de archivo delimitado ordinario. Para muchas aplicaciones, delimitado por tabuladores es bueno. El mejor delimitador IMO es ''/' porque ese carácter no tiene lugar en el texto en inglés. (Por otro lado, no funcionará para datos que contengan nombres de rutas de Windows).
CSV tiene dos problemas como formato de intercambio. Primero, no es todo ese estándar; diferentes aplicaciones reconocen diferentes versiones, independientemente de lo que diga el RFC. Segundo (y relacionado) es que no constituye un lenguaje regular en términos CS, por lo que no se puede analizar como una expresión regular. Compare con ^([^/t]*/t)*[/t]*$
para una línea delimitada por tabuladores. La implicación práctica de la complejidad de la definición de CSV es (ver arriba) la relativa escasez de herramientas para manejarlas y su tendencia a ser incompatibles, particularmente durante las primeras horas.
Si le da arranque a CSV y DTS, tiene buenas opciones, una de las cuales es bcp.exe
. Es muy rápido y seguro porque Microsoft no ha tenido la tentación de actualizarlo durante años. No sé mucho sobre DTS, pero en caso de que tenga que usarlo para la automatización, IIRC hay una manera de invocar utilidades externas. Sin embargo, bcp.exe
cuidado de que bcp.exe
no devuelva el estado de error al shell de manera confiable.
Si está decidido a usar DTS y seguir con CSV, entonces realmente la mejor opción que le queda es escribir una vista que prepare los datos de manera apropiada para ello. Si estuviera respaldado en esa esquina, crearía un esquema llamado, por ejemplo, "DTS2012CSV", para que yo pudiera escribir select * from DTS2012CSV.tablename
, lo que le daría a cualquier persona que tenga una gran oportunidad de entenderlo (porque lo documentará, ¿No lo harás, en los comentarios en el texto de la vista?). Si es necesario, otros pueden copiar su técnica para otros extractos rotos.
HTH.
Sé que esto tiene dos años, pero ahora también estoy teniendo este problema, ya que necesitamos usar SQL Server 2008 para un contrato que tenemos (no preguntes). Después de leer esta pregunta, me di cuenta de que tenía que hacer la sugerencia de reemplazo, pero cuando llegué a hacerlo en la consulta, me encontré con problemas de truncamiento, porque el uso de la función replace () en la consulta convertiría el texto a una varchar (8000) por defecto.
Sin embargo, descubrí que podía hacer lo mismo utilizando un paso de columna derivada entre los objetos DB Source y Flat File. Por ejemplo, tengo una columna llamada "short_description", que podría contener comillas, así que acabo de utilizar la siguiente función como expresión, y seleccioné "Replace short_description" en la columna Derivada:
REPLACE(short_description,"/"","/"/"")
Esto parece haber resuelto el problema para mí.