¿Cómo obtener la salida de exportación en formato CSV "real" en SQL Server Management Studio?

80

Tengo una consulta que estoy ejecutando en SQL Server Management Studio (conectándome a una base de datos de SQL Server 2005). Quiero exportar los datos en formato CSV. No se trata del formato CSV, en el que simplemente colocas una coma entre cada columna, sino del formato CSV "real", en el que pones comillas alrededor de las cadenas. De esta forma, puede exportar datos que contengan comas o comillas.

Todos los ejemplos que veo se limitan al formato wannabe. No puedo averiguar dónde está la opción de citar cadenas.

Si SSMS es realmente incapaz de esta hazaña básica, ¿existen otras herramientas que lo hagan fácilmente? No quiero tener que escribir un programa en C # cada vez que necesito un volcado de datos.

Peter Recore
fuente
1
Debido a que me molestaba
Dan
3
¿Cómo diablos esto no se ha solucionado todavía ...
Rei Miyasaka

Respuestas:

124

En SSMS 2012 hay una opción para esto, en Herramientas -> Opciones -> Resultados de la consulta -> SQL Server -> Resultados a la cuadrícula, se llama "Citar cadenas que contienen separadores de lista al guardar resultados .csv". No sé cuánto tiempo ha existido esa opción, pero estoy desconcertado por dos cosas:

  1. ¿Cómo es que no está activado de forma predeterminada?
  2. ¿Por qué es una opción y no una parte intrínseca del código de exportación CSV?

Simplemente desafía la creencia de que el comportamiento predeterminado es tener una exportación CSV que es imposible de importar correctamente. He notado que Excel hace lo mismo, tendré que ir a ver si también tiene una opción.

Mientras tanto, gracias a mi colega que me señaló esta extraña funcionalidad cuando estaba despotricando sobre cómo el exportador CSV era completamente inútil, y este era el mejor enlace que había encontrado al respecto, así que pensé en poner el conocimiento aquí en beneficio de futuros buscadores.

ACTUALIZAR

Una captura de pantalla a continuación:ingrese la descripción de la imagen aquí

Matthew Walton
fuente
4
También existe en SSMS 2008.
Lloyd
21
Nota : SSMS calificará un campo que contenga un delimitador o calificador, pero no calificará un campo que contenga saltos de línea. Entonces, en este sentido, SSMS produce archivos CSV técnicamente no válidos
KyleMit
41
Para cualquier otra persona que haya tenido el mismo problema que yo tuve: debe abrir una nueva ventana del editor de consultas para que los cambios surtan efecto. Hacer Save Results As..en el mismo conjunto de resultados antes / después de cambiar el comportamiento no hace ninguna diferencia en el CSV exportado.
Jason Larke
7
En SSMS v17 encontré que faltaba la opción especificada, sin embargo, parece que se ha fusionado con la otra opción 'Incluir encabezados de columna al copiar o guardar los resultados', porque verificar eso tuvo el efecto deseado para mí. Aún es necesario abrir una nueva ventana de consulta para que la configuración surta efecto.
Nine Tails
9
Microsoft: "Hagamos de CSV el formato de exportación predeterminado para SSMS". También Microsoft: "Vamos a ignorar los detalles básicos de implementación".
Owen
12

Mi solución alternativa normal es incorporarlo a la consulta:

SELECT '"' + REPLACE(CAST(column AS NVARCHAR(4000)), '"', '""') + '"' AS Header, ... FROM ...

Puede incorporar eso en una función definida por el usuario, para que sea un poco más fácil, pero debe crear una función separada para cada tipo de datos.

Joel Coehoorn
fuente
2
Puede que no sea necesario, pero me resulta más fácil hacerlo '"' + REPLACE(CAST(column AS VARCHAR), '"', '""') + '"'. De esa manera, no me preocuparé por socavar un campo.
Rob
1
Hoy, uso varchar (max). Cuando escribí esto originalmente, acababa de llegar de una tienda que todavía estaba en (ugh) Sql Server 2000 y solo comenzaba a mirar 2005.
Joel Coehoorn
También es posible que deba conservar el tipo de columna, por ejemplo, NVARCHARsi el tipo original era NVARCHAR.
NM
Buen punto. varchar => nvarchar se está ampliando, no romperá las cosas, pero nvarchar => varchar podría perder datos. Lo mejor que puede hacer es usar lo que coincida con la columna original, pero dado que la gente tiende a copiar / pegar el código de ejemplo fuera del desbordamiento de la pila, el código en mi respuesta es probablemente mejor para usar nvarchar (y este cambio ahora está hecho).
Joel Coehoorn
Dado que Microsoft no puede hacer algo tan básico como exportar a un archivo csv, esta es la mejor solución. Mis archivos con saltos de línea no se exportaron correctamente con la solución más votada.
neves
8

Diferentes combinaciones de estas configuraciones pueden traer resultados en la salida que son datos incorrectos o parciales. Esto se debe a que Microsoft no pensó que fuera lo suficientemente importante como para solucionar estos problemas. Solo estoy explicando lo que sucede con los archivos CSV al enviar los resultados a un archivo.

Para obtener buenos resultados, haga lo siguiente:

Abra una nueva ventana de consulta (nueva pestaña / sesión) ... si no lo hace, la configuración a continuación se pierde y se restablece a los valores predeterminados

Escriba la consulta para manejar la cita dentro de la cita y también envuelva todos los tipos de datos de cadena entre comillas. También tenga en cuenta que diferentes DBMS y gramáticas de lenguaje de programación aceptan una sintaxis diferente para una comilla doble de escape (si usa esta salida como entrada a otro sistema). Algunos usan \". Algunos usan "". Utiliza XML ". Probablemente una razón por la que Microsoft eligió ignorar esta funcionalidad, para no tener que lidiar con los argumentos.

.. Si la secuencia de escape del nuevo sistema es "".

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '""') + '"' FROM table1

.. Si la secuencia de escape del nuevo sistema es \".

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '\"') + '"' FROM table1

Configuración:

Opciones de consulta> Resultados> "Incluir encabezados de columna al copiar o guardar los resultados" marcado

Opciones de consulta> Resultados> "Citar cadenas que contienen separadores de lista al guardar resultados .csv" - ROTO; ¡NO UTILICE!

Opciones de consulta> Resultados> otros sin marcar

Opciones de consulta> Resultados> Texto> delimitado por comas (configuración en la esquina superior derecha)

Opciones de consulta> Resultados> Texto> "Incluir encabezados de columna en el conjunto de resultados" marcado

Opciones de consulta> Resultados> Texto> otros sin marcar

Opciones de consulta> Resultados> Texto> "Número máximo de caracteres mostrados en cada columna": establezca la longitud máxima para que las cadenas no se trunquen.

Consulta> Resultados a archivo (esto es una alternancia entre las 3 opciones)

Ejecutar consulta (F5)

Solicitar el nombre de archivo del informe

Abrir archivo para ver los resultados

NOTA: Si necesita hacer esto de forma regular, es mejor que desarrolle un programa que lo haga por usted en .NET o Java, o en cualquier lenguaje con el que se sienta cómodo. De lo contrario, tiene una alta probabilidad de cometer un error. Luego, sea extremadamente consciente de la sintaxis del sistema al que está importando, antes de definir su exportación fuera de SQL Server.

MacGyver
fuente
7

Es triste que la opción esté disponible en un estado confuso, pero no perfectamente operativa. Lo siguiente está funcionando al menos.

  1. Elija "Tareas> Exportar datos" en el menú contextual de la base de datos (tampoco funciona a nivel de tabla)
  2. En Fuente, elija "Proveedor Microsoft OLE DB para SQL Server"
  3. Para el destino, elija "Archivo plano ..." y especifique "Formato" como delimitado y text qualifierentre comillas
  4. Seleccionar tabla o consulta (trabajé con consulta)
  5. Termina el asistente

¡Usted debe ser bueno para ir!

user1017815
fuente
5
Pensaría que esto funcionaría, pero no: las columnas que contienen comillas dobles en los datos no se escapan correctamente. Faux-csv son todas las ofertas de SQL Server en el asistente de exportación.
mattmc3
Mi consumidor o yo no teníamos motivos para quejarnos cuando los datos tenían comas y comillas simples en los campos de texto. Como ya mencioné, estaba trabajando con la opción de consulta y si conoce los campos sucios, siempre puede ajustarlos con quotename. Afortunadamente, no se encontró con comillas dobles. Y estaba sugiriendo una opción nativa, en lugar de depender de soluciones externas.
user1017815
Esta opción sigue siendo la más práctica, aunque no escapa automáticamente de las comillas dobles. Es bastante fácil escapar de las comillas dobles con replace ().
Brett Donald
4

¿Qué opina de Exportar a CSV desde SSMS a través de PowerShell ? Esta publicación describe cómo definir una herramienta externa en SSMS que envía la consulta seleccionada actualmente a un script de PowerShell que se exporta a un CSV.

billinkc
fuente
Hasta ahora, esto parece ser la mejor inversión para mi dinero. Ni siquiera lo he agregado al menú Herramientas externas en SSMS; solo lo estoy ejecutando desde la línea de comandos.
Peter Recore
1

No conozco ninguna forma de hacer esto solo con SSMS. Sé que TOAD (http://www.toadworld.com/) tiene una opción CSV. No estoy seguro si es un formato de escape. Si SSIS es una opción, puede convertir a un formato que escapa a las cadenas (verdadero CSV), pero que no está en SSMS.

Si tiene que escribir un programa en C #, consideraría consultar la tabla y luego ejecutar la consulta, ya que los metadatos darán una pista de qué necesita el escape.

Gregory A Beamer
fuente
1

Por lo general, uso este tipo de función:

CREATE FUNCTION [dbo].[toExport]
(
    @txt varchar(max)

)
RETURNS varchar(max)
AS
BEGIN

    return REPLACE(REPLACE(REPLACE(@txt, ';', ','), CHAR(10), ' '), CHAR(13), ' ');

END

Y en selecto lo puse aquí:

SELECT dbo.toExport( column_name ) AS column_name FROM ....

Y en SMSS 2012 simplemente haga clic derecho en una cuadrícula y guarde los resultados como, o copie toda la cuadrícula (ctrl-A) y ctrl-V a Excel.

Es la forma más sencilla de administrar datos, por ejemplo, en MS Excel sin problemas con las columnas.

Por supuesto, debe hacer clic en "Citar cadenas que contienen separadores de lista al guardar los resultados .csv" en Herramientas -> Opciones -> Resultados de la consulta -> Servidor SQL -> Resultados a la cuadrícula y aumentar el número máximo de caracteres recuperados si lo necesita.

Maciej Niemir
fuente
1

Tal vez esto no funcione para su aplicación, pero normalmente soluciono este problema exportando a un formato delimitado por tabulaciones. No pase por alto esta sencilla solución si se aplica a usted.

Brian Wirt
fuente
1

Como todas las configuraciones mencionadas anteriormente no arreglaron el CSV que generó mi SSMS (SQL Server 2014) y exportar un archivo separado por pestañas no lo mejoró, un colega y yo hicimos un script de conversión (Ruby) para convertir el SSMS CSV en CSV legible. Mantiene la codificación, los separadores y los saltos de línea del archivo original e incluso realiza una validación de coincidencia de bytes exacta al final (crea un archivo en formato SSMS a partir del archivo de entrada analizado (!) Y compara ambos archivos).

https://gist.github.com/gr8bit/62202ea89a7e3aff67df2ff080ee8e88

Contácteme en github si encuentra errores, por favor. ¡Salud!

Niklas B.
fuente
Necesito probar esto, pero parece exactamente lo que necesitamos y ya está en Ruby. ¡Excelente!
Ladislav Gallay
0

Creo que lo más fácil es abrir Excel e importar los datos de la conexión SQL en lugar de usar la exportación SSMS ... Estoy usando SSMS 2016 y no tiene la opción "Citar cadenas que contienen separadores de listas al guardar resultados .csv" presumiblemente porque no funciona

Ron

ron
fuente
0

A partir de 2016, este es el comportamiento predeterminado cuando se selecciona la siguiente opción en Opciones de consulta:

ingrese la descripción de la imagen aquí

Las columnas están delimitadas por comas y los campos que contienen comas están encapsulados entre comillas dobles.

brazofuerte
fuente
0

Me gustaría sugerir un enfoque alternativo. Tengo esta pregunta marcada en SO. Votado en muchas de las respuestas y comentarios. Pero siempre es un desastre cuando necesito hacer la tarea banal de exportar un archivo CSV desde una consulta en SQL Management Studio.

La solución más sencilla es utilizar otra herramienta, la Dbeaver gratuita .

  1. Descargue la herramienta de base de datos multiplataforma Dbeaver (hay una versión portátil que puede usar si no tiene derechos de administrador en su máquina).
  2. Ejecútelo y cree una nueva conexión de SQL Server.
  3. Abra una nueva pestaña "Editor SQL"
  4. Haga clic en la flecha para ejecutar su consulta
  5. Haga clic derecho en la cuadrícula de resultados, seleccione "exportar datos" y seleccione CSV
  6. ¡Voilá! Ahora tiene un archivo CSV con un formato decente.

Sin misterio. No es necesario reiniciar. Simplemente funciona.

neves
fuente