Con PowerShell puoi risolvere il problema ordinatamente eseguendo il piping di Invoke-Sqlcmd in 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 include il modulo SqlServer , che contiene il Invoke-Sqlcmd
cmdlet, che avrai anche se hai appena installato SSMS 2016. Prima di ciò, SQL Server 2012 includeva il vecchio modulo SQLPS , che avrebbe cambiato la directory corrente a SQLSERVER:\
quando il modulo era usato per la prima volta (tra gli altri bug) quindi, per questo, dovrai cambiare la #Requires
riga sopra in:
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
Per adattare l'esempio per SQL Server 2008 e 2008 R2, rimuovere completamente la #Requires
riga e utilizzare l' utilità sqlps.exe anziché l'host PowerShell standard.
Invoke-Sqlcmd è l'equivalente di PowerShell di sqlcmd.exe. Invece del testo, genera oggetti System.Data.DataRow .
Il -Query
parametro funziona come il -Q
parametro di sqlcmd.exe. Passa una query SQL che descriva i dati che desideri esportare.
Il -Database
parametro funziona come il -d
parametro di sqlcmd.exe. Passare il nome del database che contiene i dati da esportare.
Il -Server
parametro funziona come il -S
parametro di sqlcmd.exe. Passare il nome del server che contiene i dati da esportare.
Export-CSV è un cmdlet di PowerShell che serializza oggetti generici su CSV. Viene fornito con PowerShell.
Il -NoTypeInformation
parametro elimina l'output aggiuntivo che non fa parte del formato CSV. Per impostazione predefinita, il cmdlet scrive un'intestazione con informazioni sul tipo. Ti consente di conoscere il tipo di oggetto quando lo deserializzi successivamente con Import-Csv
, ma confonde gli strumenti che prevedono CSV standard.
Il -Path
parametro funziona come il -o
parametro di sqlcmd.exe. Un percorso completo per questo valore è più sicuro se si è bloccati utilizzando il vecchio modulo SQLPS .
Il -Encoding
parametro funziona come i parametri -f
o -u
di sqlcmd.exe. Per impostazione predefinita, Export-Csv genera solo caratteri ASCII e sostituisce tutti gli altri con punti interrogativi. Usa invece UTF8 per preservare tutti i personaggi e rimanere compatibile con la maggior parte degli altri strumenti.
Il vantaggio principale di questa soluzione rispetto a sqlcmd.exe o bcp.exe è che non è necessario hackerare il comando per generare CSV validi. Il cmdlet Export-Csv gestisce tutto per te.
Lo svantaggio principale è che Invoke-Sqlcmd
legge l'intero set di risultati prima di passarlo lungo la pipeline. Assicurarsi di disporre di memoria sufficiente per l'intero set di risultati che si desidera esportare.
Potrebbe non funzionare senza problemi per miliardi di righe. Se questo è un problema, puoi provare gli altri strumenti o creare la tua versione efficiente Invoke-Sqlcmd
dell'utilizzo della classe System.Data.SqlClient.SqlDataReader .