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 los nombres de las columnas 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 pasará a la siguiente línea)
Con PowerShell, puede resolver el problema de forma 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 acaba de instalar 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 utilizó por primera vez (entre otros errores), por lo que deberá cambiar el #Requires
línea de arriba para:
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, elimine 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 en PowerShell de sqlcmd.exe. En lugar de texto, genera objetos System.Data.DataRow.
los -Query
El parámetro funciona como el -Q
parámetro de sqlcmd.exe. Pásale una consulta SQL que describa los datos que deseas exportar.
los -Database
El parámetro funciona como el -d
parámetro de sqlcmd.exe. Pásale el nombre de la base de datos que contiene los datos a exportar.
los -Server
El parámetro funciona como el -S
parámetro de sqlcmd.exe. Pásale 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.
los -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 de objeto cuando lo deserializa más tarde con Import-Csv
, pero confunde las herramientas que esperan CSV estándar.
los -Path
El 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.
los -Encoding
El parámetro funciona como el -f
o -u
parámetros de sqlcmd.exe. De forma predeterminada, Export-Csv genera solo caracteres ASCII y reemplaza todos los demás con signos de interrogación. En su lugar, use UTF8 para conservar todos los caracteres y mantener la compatibilidad con la mayoría de las otras herramientas.
La principal ventaja de esta solución sobre sqlcmd.exe o bcp.exe es que no tiene que piratear el comando para generar un CSV válido. El cmdlet Export-Csv se encarga de 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.
Puede que no funcione correctamente para miles de millones de filas. Si eso es un problema, puede probar las otras herramientas o lanzar 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 columnas a la coma (,) -
-w 999
establece el ancho de la fila en 999 caracteres
La respuesta de Scottm es muy parecida a la que yo uso, pero encuentro el -W
para ser una adición realmente agradable: no necesito recortar los espacios en blanco cuando consumo el CSV en otro lugar.
Consulte también la referencia sqlcmd de MSDN. Pone el /?
salida de la opción a la vergüenza.