Avec PowerShell, vous pouvez résoudre le problème proprement en envoyant Invoke-Sqlcmd dans 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 inclut le module SqlServer , qui contient l' Invoke-Sqlcmd
applet de commande, que vous aurez même si vous installez simplement SSMS 2016. Auparavant, SQL Server 2012 incluait l'ancien module SQLPS , qui modifiait le répertoire actuel en celui SQLSERVER:\
où le module était utilisé pour la première fois (parmi d'autres bogues) donc pour cela, vous devrez changer la #Requires
ligne ci-dessus en:
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
Pour adapter l'exemple à SQL Server 2008 et 2008 R2, supprimez #Requires
entièrement la ligne et utilisez l' utilitaire sqlps.exe au lieu de l'hôte PowerShell standard.
Invoke-Sqlcmd est l'équivalent PowerShell de sqlcmd.exe. Au lieu de texte, il génère des objets System.Data.DataRow .
Le -Query
paramètre fonctionne comme le -Q
paramètre de sqlcmd.exe. Transmettez-lui une requête SQL décrivant les données que vous souhaitez exporter.
Le -Database
paramètre fonctionne comme le -d
paramètre de sqlcmd.exe. Transmettez-lui le nom de la base de données contenant les données à exporter.
Le -Server
paramètre fonctionne comme le -S
paramètre de sqlcmd.exe. Transmettez-lui le nom du serveur contenant les données à exporter.
Export-CSV est une applet de commande PowerShell qui sérialise des objets génériques au format CSV. Il est livré avec PowerShell.
Le -NoTypeInformation
paramètre supprime la sortie supplémentaire qui ne fait pas partie du format CSV. Par défaut, l'applet de commande écrit un en-tête avec des informations de type. Il vous permet de connaître le type de l'objet lorsque vous le désérialisez plus tard avec Import-Csv
, mais il confond les outils qui attendent un CSV standard.
Le -Path
paramètre fonctionne comme le -o
paramètre de sqlcmd.exe. Un chemin complet pour cette valeur est le plus sûr si vous êtes bloqué à l'aide de l'ancien module SQLPS .
Le -Encoding
paramètre fonctionne comme les paramètres -f
ou -u
de sqlcmd.exe. Par défaut, Export-Csv génère uniquement des caractères ASCII et remplace tous les autres par des points d'interrogation. Utilisez plutôt UTF8 pour conserver tous les caractères et rester compatible avec la plupart des autres outils.
Le principal avantage de cette solution par rapport à sqlcmd.exe ou bcp.exe est que vous n'avez pas à pirater la commande pour générer un CSV valide. L'applet de commande Export-Csv gère tout pour vous.
Le principal inconvénient est qu'il Invoke-Sqlcmd
lit l'ensemble des résultats avant de le transmettre le long du pipeline. Assurez-vous que vous disposez de suffisamment de mémoire pour l'ensemble du jeu de résultats que vous souhaitez exporter.
Cela peut ne pas fonctionner correctement pour des milliards de lignes. Si cela pose un problème, vous pouvez essayer les autres outils ou Invoke-Sqlcmd
utiliser votre propre version efficace de la classe System.Data.SqlClient.SqlDataReader .