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.
sql-server
csv
ssms
Peter Recore
fuente
fuente
Respuestas:
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:
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:
fuente
Save Results As..
en el mismo conjunto de resultados antes / después de cambiar el comportamiento no hace ninguna diferencia en el CSV exportado.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.
fuente
'"' + REPLACE(CAST(column AS VARCHAR), '"', '""') + '"'
. De esa manera, no me preocuparé por socavar un campo.NVARCHAR
si el tipo original eraNVARCHAR
.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
fuente
Es triste que la opción esté disponible en un estado confuso, pero no perfectamente operativa. Lo siguiente está funcionando al menos.
text qualifier
entre comillas¡Usted debe ser bueno para ir!
fuente
quotename
. Afortunadamente, no se encontró con comillas dobles. Y estaba sugiriendo una opción nativa, en lugar de depender de soluciones externas.¿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.
fuente
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.
fuente
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.
fuente
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.
fuente
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!
fuente
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
fuente
A partir de 2016, este es el comportamiento predeterminado cuando se selecciona la siguiente opción en Opciones de consulta:
Las columnas están delimitadas por comas y los campos que contienen comas están encapsulados entre comillas dobles.
fuente
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 .
Sin misterio. No es necesario reiniciar. Simplemente funciona.
fuente