Exportar el resultado de la consulta al archivo .csv en SQL Server 2008

141

¿Cómo puedo exportar un resultado de consulta a un archivo .csv en SQL Server 2008?

Oro
fuente
¿Necesitas tu delimitador escapado? La mayoría de las respuestas hasta ahora suponen que no, lo cual no es realmente todo ese CSV.
Nick
@Nick: en general, los delimitadores están contenidos solo con una cadena, y generalmente tienen comillas alrededor de ellos. Vea mi respuesta para ver la solución a esto. stackoverflow.com/questions/6115054/…
MacGyver
A veces uso Python
LV98

Respuestas:

168
  1. Abra SQL Server Management Studio
  2. Vaya a Herramientas> Opciones> Resultados de la consulta> SQL Server> Resultados a texto
  3. En el extremo derecho, hay un cuadro desplegable llamado Formato de salida
  4. Elija delimitado por comas y haga clic en Aceptar

Aquí hay una versión de pantalla completa de esa imagen, a continuación

ingrese la descripción de la imagen aquí

Esto mostrará los resultados de su consulta como texto delimitado por comas.

Para guardar los resultados de una consulta en un archivo: Ctrl + Shift + F

8kb
fuente
10
La respuesta es un poco engañosa ... Cuando presiona Ctrl+Shift+F, solo cambia el modo de salida, no afecta los resultados si ya ejecutó la consulta. Para que esto se refleje, debe volver a ejecutar la consulta. Cuando lo ejecute en el modo "Resultados a archivo", debería preguntarle dónde desea guardar los resultados.
qJake
3
Debe ir a Herramientas> Opciones> Resultados de la consulta> SQL Server > Resultados a texto
congusbongus
45
Volver a ejecutar la consulta no fue suficiente para mí. Tuve que cerrar la ventana de consulta, abrir una nueva y luego ejecutar la consulta nuevamente.
Breandán
3
Comentario confirmado de @ Breandán. La nueva configuración no se aplicará a la ventana de consulta abierta actualmente, debe cerrarla y volver a ejecutar la consulta.
Shinigamae
3
Una cosa que tuve que hacer fue exportarlo como la extensión RPT predeterminada. Después de hacer eso, simplemente puede cambiarle el nombre a un CSV y funciona.
Thomas Bennett
140

Sé que esto es un poco viejo, pero aquí hay una manera mucho más fácil ...

  1. Ejecute su consulta con la configuración predeterminada (coloca los resultados en formato de cuadrícula, si el suyo no está en formato de cuadrícula, consulte a continuación)

  2. Haga clic derecho en los resultados de la cuadrícula y haga clic en "Guardar resultados como" y guárdelo.

Si sus resultados no están en formato de cuadrícula, haga clic con el botón derecho donde escribe la consulta, desplace "Resultados a" y haga clic en "Resultados a la cuadrícula"

¡Tenga en cuenta que NO captura los encabezados de columna!

¡Buena suerte!

Ricketts
fuente
1
El único problema es que este método parece no permitirle configurar ninguna opción. Por ejemplo, todos los NULL se muestran en los archivos de salida como "NULL", etc. Sin embargo, quizás haya una manera de configurar esto que no conozco.
Noah
13
Sorprendentemente, incluso en SSMS 2012, esto no cita correctamente el texto para CSV. Se debe citar una coma o una nueva línea dentro de CHAR / VARCHAR, pero no es así. Eso hace que los datos cambien a nuevas columnas o a una nueva línea.
Eric J.
44
Tampoco te da encabezados de columna.
Don
8
@Don esto da encabezados de columna si va a "Consulta" -> "Opciones de consulta ...", pestaña de cuadrícula y marca "incluir encabezados de columna al copiar o guardar resultados"
Rob Wise
77
Esta debería ser la respuesta.
pspahn
46

Puedes usar PowerShell

$AttachmentPath = "CV File location"
$QueryFmt= "Query"

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $QueryFmt | Export-CSV $AttachmentPath
NS
fuente
¡Gracias! Esta fue la única sugerencia que funcionó para mí. Las manijas se escapan correctamente
emertechie
3
+10 si pudiera. Solo responde que maneja el escape. Para que esto se ejecute, tuve que agregar dos líneas en la parte superior del script: Add-PSSnapin SqlServerCmdletSnapin100y Add-PSSnapin SqlServerProviderSnapin100.
Eric J.
si enfrenta un tiempo de espera, agregue el tiempo de espera de la consulta, por ejemploInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo el
1
Como novato en Powershell, necesitaba instalar el Módulo SqlServer: Install-Module -Name SqlServer(pero no necesitaba ajustar esos Cmdlets). Además, me había salvado los comandos en un script, que no se presentaría hasta que había cambiado la política de ejecución: Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser.
Sandyscott
@sandyscott También soy un novato de Powershell, así que gracias. De todos modos, creo que en este caso una RemoteSignedpolítica de ejecución será suficiente.
BigBother
14

Si la base de datos en cuestión es local, la siguiente es probablemente la forma más sólida de exportar el resultado de una consulta a un archivo CSV (es decir, darle el mayor control).

  1. Copia la consulta.
  2. En el Explorador de objetos, haga clic derecho en la base de datos en cuestión.
  3. Seleccione "Tareas" >> "Exportar datos ..."
  4. Configure su fuente de datos y haga clic en "Siguiente".
  5. Elija "Archivo plano" o "Microsoft Excel" como destino.
  6. Especifique una ruta de archivo.
  7. Si trabaja con un archivo plano, configúrelo como desee. Si trabaja con Microsoft Excel, seleccione "Excel 2007" (las versiones anteriores tienen un límite de fila de 64k)
  8. Seleccione "Escribir una consulta para especificar los datos a transferir"
  9. Pegue la consulta del Paso 1.
  10. Haga clic en siguiente >> revisar asignaciones >> haga clic en siguiente >> seleccione "ejecutar inmediatamente" >> haga clic en "finalizar" dos veces.

Después de pasar por este proceso exhaustivamente, encontré que la siguiente es la mejor opción

Script de PowerShell

$dbname = "**YOUR_DB_NAME_WITHOUT_STARS**"
$AttachmentPath = "c:\\export.csv"
$QueryFmt= @"
**YOUR_QUERY_WITHOUT_STARS**
"@

Invoke-Sqlcmd   -ServerInstance **SERVER_NAME_WITHOUT_STARS** -Database  $dbname -Query $QueryFmt | Export-CSV $AttachmentPath -NoTypeInformation

Ejecute PowerShell como administrador

& "c:\path_to_your_ps1_file.ps1"
pimbrouwers
fuente
1
si enfrenta un tiempo de espera, agregue el tiempo de espera de la consulta, por ejemploInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo el
6

MS Excel -> Datos -> Nueva consulta -> Desde la base de datos ... siga los pasos

tichra
fuente
6

Basándome en la respuesta de NS, tengo un script de PowerShell que exporta a un archivo CSV con las comillas alrededor del campo y separadas por comas y omite la información del encabezado en el archivo.

add-pssnapin sqlserverprovidersnapin100
add-pssnapin sqlservercmdletsnapin100

$qry = @"
Select
  *
From
 tablename
"@

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $qry | convertto-CSV -notype | select -skip 1  > "full path and filename.csv"

Las primeras dos líneas permiten la capacidad de usar el comando-let Invoke-SqlCmd .

BeowulfNode42
fuente
6

Use T-SQL :

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

Pero, hay un par de advertencias:

  1. Debe tener disponible el proveedor Microsoft.ACE.OLEDB.12.0. El proveedor de Jet 4.0 también funcionará, pero es antiguo, así que utilicé este en su lugar.

  2. El archivo .CSV ya debe existir. Si está utilizando encabezados ( HDR=YES), asegúrese de que la primera línea del archivo .CSV sea una lista delimitada de todos los campos.

Slogmeister Extraordinaire
fuente
3

Usar la técnica nativa de SQL Server Management Studio para exportar a CSV (como sugirió @ 8kb) no funciona si sus valores contienen comas, porque SSMS no ajusta los valores entre comillas dobles. Una forma más sólida que funcionó para mí es simplemente copiar los resultados (hacer clic dentro de la cuadrícula y luego CTRL-A, CTRL-C) y pegarlo en Excel. Luego guarde como archivo CSV desde Excel.

Johnny Oshika
fuente
2

Puede usar QueryToDoc ( http://www.querytodoc.com ). Le permite escribir una consulta en una base de datos SQL y exportar los resultados, después de elegir el delimitador, a Excel, Word, HTML o CSV

Robert
fuente
2
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

como @Slogmeister Extraordinaire Quoted es correcto.

Uno necesita tener 1> Archivo ya presente con columnas 2> Uno necesita tener Office instalado

Errores enfrentados

1

Mensaje 7303, Nivel 16, Estado 1, Línea 1 No se puede inicializar el objeto de origen de datos del proveedor OLE DB "Microsoft.ACE.OLEDB.12.0" para el servidor vinculado "(nulo)". "

64 bit http://download.microsoft.com/download/2/4/3/24375141-E08D-4803-AB0E-10F2E3A07AAA/AccessDatabaseEngine_x64.exe

Http://download.microsoft.com/download/f/d/8/fd8c20d8-e38a-48b6-8691-542403b91da1/AccessDatabaseEngine.exe de 32 bits

2

Msg 15281, Nivel 16, Estado 1, Línea 1 SQL Server bloqueó el acceso a la DECLARACIÓN 'OpenRowset / OpenDatasource' del componente 'Consultas distribuidas ad hoc' porque este componente está desactivado como parte de la configuración de seguridad para este servidor. Un administrador del sistema puede habilitar el uso de 'Consultas distribuidas ad hoc' utilizando sp_configure. Para obtener más información sobre cómo habilitar 'Consultas distribuidas ad hoc', busque 'Consultas distribuidas ad hoc' en los Libros en pantalla de SQL Server.

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 0
RECONFIGURE
GO
sam
fuente
2

Si no desea utilizar Powershell, esta respuesta es una variación de la gran respuesta de 8 kb. La única diferencia es que, en lugar de seleccionar CSV como formato de salida, seleccione Delimitado por tabuladores. De esta manera, si hay comas en sus datos, no omitirá celdas en Excel. Además, si tiene el delimitador predeterminado de Excel establecido en pestañas, simplemente puede hacer una copia de todos los resultados de la consulta SSMS (CTRL-A, CTRL-C) y pegar en Excel (no es necesario guardarlo como un archivo e importarlo a Excel ):

  • En SSMS, vaya a Herramientas> Opciones> Resultados de la consulta> SQL Server> Resultados al texto
  • Cambie el formato de salida en el extremo derecho a Delimitado por tabuladores
  • Haga clic en Aceptar

Ahora puede ejecutar su consulta, luego hacer una CTRL-A para seleccionar todos los resultados, luego CTRL-C para copiar al portapapeles, luego cambiar a Excel 2013 (puede funcionar también en 2007, no estoy seguro) y pegar, suponiendo que Excel esté predeterminado delimitador se establece en tab.

Imagen de la pantalla de opciones de consulta de SSMS

TomWalker
fuente
-1

Sí, todo esto es posible cuando tiene acceso directo a los servidores. Pero, ¿qué sucede si solo tiene acceso al servidor desde un servidor web / de aplicaciones? Bueno, la situación fue esto con nosotros hace mucho tiempo y la solución fue Exportar SQL Server a CSV .

Jiju Thomas Mathew
fuente
Enlace ... ¿Acceso denegado?
Hoggar