Saltar al contenido

¿Cómo exportar datos como formato CSV desde SQL Server usando sqlcmd?

Recabamos por distintos espacios para tenerte la respuesta para tu dilema, si continúas con alguna inquietud puedes dejar la pregunta y te contestamos sin falta.

Solución:

Puedes ejecutar algo como esto:

sqlcmd -S MyServer -d myDB -E -Q "select col1, col2, col3 from SomeTable" 
       -o "MyData.csv" -h-1 -s"," -w 700
  • -h-1 elimina los encabezados de nombre de columna del resultado
  • -s"," establece el separador de columnas en ,
  • -w 700 establece el ancho de la fila en 700 caracteres (esto deberá ser tan ancho como la fila más larga o se ajustará a la siguiente línea)

Con PowerShell, puede resolver el problema de manera ordenada conectando Invoke-Sqlcmd a Export-Csv.

#Requires -Module SqlServer
Invoke-Sqlcmd -Query "SELECT * FROM DimDate;" `
              -Database AdventureWorksDW2012 `
              -Server localhost |
Export-Csv -NoTypeInformation `
           -Path "DimDate.csv" `
           -Encoding UTF8

SQL Server 2016 incluye el Servidor SQL módulo, que contiene el Invoke-Sqlcmd cmdlet, que tendrá incluso si solo instala SSMS 2016. Antes de eso, SQL Server 2012 incluía el antiguo SQLPS módulo, que cambiaría el directorio actual a SQLSERVER: cuando el módulo se usó por primera vez (entre otros errores), por lo que deberá cambiar el #Requires línea de arriba a:

Push-Location $PWD
Import-Module -Name SQLPS
# dummy query to catch initial surprise directory change
Invoke-Sqlcmd -Query "SELECT 1" `
              -Database  AdventureWorksDW2012 `
              -Server localhost |Out-Null
Pop-Location
# actual Invoke-Sqlcmd |Export-Csv pipeline

Para adaptar el ejemplo para SQL Server 2008 y 2008 R2, quite el #Requires línea por completo y use la utilidad sqlps.exe en lugar del host estándar de PowerShell.

Invoke-Sqlcmd es el equivalente de PowerShell de sqlcmd.exe. En lugar de texto, genera objetos System.Data.DataRow.

Él -Query parámetro funciona como el -Q parámetro de sqlcmd.exe. Pásele una consulta SQL que describa los datos que desea exportar.

Él -Database parámetro funciona como el -d parámetro de sqlcmd.exe. Pásele el nombre de la base de datos que contiene los datos a exportar.

Él -Server parámetro funciona como el -S parámetro de sqlcmd.exe. Pásele el nombre del servidor que contiene los datos a exportar.

Export-CSV es un cmdlet de PowerShell que serializa objetos genéricos en CSV. Se envía con PowerShell.

Él -NoTypeInformation El parámetro suprime la salida adicional que no forma parte del formato CSV. De forma predeterminada, el cmdlet escribe un encabezado con información de tipo. Le permite saber el tipo del objeto cuando lo deserializa más tarde con Import-Csvpero confunde las herramientas que esperan CSV estándar.

Él -Path parámetro funciona como el -o parámetro de sqlcmd.exe. Una ruta completa para este valor es más segura si está atascado usando el antiguo SQLPS módulo.

Él -Encoding parámetro funciona como el -f o -u parámetros de sqlcmd.exe. Por defecto, Export-Csv genera solo caracteres ASCII y reemplaza todos los demás con signos de interrogación. Utilice UTF8 en su lugar para conservar todos los caracteres y mantener la compatibilidad con la mayoría de las demás herramientas.

La principal ventaja de esta solución sobre sqlcmd.exe o bcp.exe es que no es necesario piratear el comando para generar un CSV válido. El cmdlet Export-Csv lo maneja todo por usted.

La principal desventaja es que Invoke-Sqlcmd lee todo el conjunto de resultados antes de pasarlo a lo largo de la canalización. Asegúrese de tener suficiente memoria para todo el conjunto de resultados que desea exportar.

Es posible que no funcione sin problemas para miles de millones de filas. Si eso es un problema, puede probar las otras herramientas o implementar su propia versión eficiente de Invoke-Sqlcmd utilizando la clase System.Data.SqlClient.SqlDataReader.

sqlcmd -S myServer -d myDB -E -o "MyData.txt" ^
    -Q "select bar from foo" ^
    -W -w 999 -s","

La última línea contiene opciones específicas de CSV.

  • -W eliminar los espacios finales de cada campo individual
  • -s"," establece el separador de columna en la coma (,)
  • -w 999 establece el ancho de fila en 999 caracteres

la respuesta de scottm está muy cerca de lo que uso, pero encuentro el -W para ser una muy buena adición: no necesito recortar los espacios en blanco cuando consumo el CSV en otro lugar.

Consulte también la referencia de MSDN sqlcmd. pone el /? salida de la opción a la vergüenza.

Recuerda que tienes la capacidad de reseñar si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *