Con PowerShell, puede resolver el problema de manera ordenada si conecta 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 módulo SqlServer , que contiene el Invoke-Sqlcmd
cmdlet, que tendrá incluso si instala SSMS 2016. Antes de eso, SQL Server 2012 incluía el antiguo módulo SQLPS , que cambiaría el directorio actual SQLSERVER:\
cuando el módulo estaba instalado. utilizado por primera vez (entre otros errores), por lo que deberá cambiar la #Requires
línea anterior 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, elimine la #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 .
El -Query
parámetro funciona como el -Q
parámetro de sqlcmd.exe. Pase una consulta SQL que describa los datos que desea exportar.
El -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.
El -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.
El -NoTypeInformation
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 Import-Csv
, pero confunde las herramientas que esperan CSV estándar.
El -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 con el antiguo módulo SQLPS .
El -Encoding
parámetro funciona como los parámetros -f
o -u
de sqlcmd.exe. De forma predeterminada, Export-Csv genera solo caracteres ASCII y reemplaza todos los demás con signos de interrogación. Utilice UTF8 en su lugar para preservar todos los caracteres y mantenerse compatible 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 hackear el comando para generar 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 por la tubería. 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 lanzar su propia versión eficiente del Invoke-Sqlcmd
uso de la clase System.Data.SqlClient.SqlDataReader .