Avec PowerShell, vous pouvez résoudre le problème de façon très simple en intégrant 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 la SqlServer qui contient le module Invoke-Sqlcmd
cmdlet, que vous aurez même si vous installez SSMS 2016. Avant cela, SQL Server 2012 incluait l'ancienne commande SQLPS module ce qui changerait le répertoire actuel en SQLSERVER:\
lorsque le module a été utilisé pour la première fois (parmi d'autres bogues), donc pour cela, vous devrez modifier le fichier #Requires
ligne ci-dessus à :
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 la balise #Requires
entièrement et utiliser l'option Utilitaire sqlps.exe au lieu de l'hôte PowerShell standard.
Invoke-Sqlcmd est l'équivalent PowerShell de sqlcmd.exe. Au lieu d'un texte, il affiche System.Data.DataRow objets.
Le site -Query
fonctionne comme le paramètre -Q
de sqlcmd.exe. Passez-lui une requête SQL qui décrit les données que vous voulez exporter.
Le site -Database
fonctionne comme le paramètre -d
de sqlcmd.exe. Passez-lui le nom de la base de données qui contient les données à exporter.
Le site -Server
fonctionne comme le paramètre -S
du paramètre sqlcmd.exe. Passez-lui le nom du serveur qui contient les données à exporter.
Export-CSV est une cmdlet PowerShell qui sérialise les objets génériques au format CSV. Elle est fournie avec PowerShell.
Le site -NoTypeInformation
supprime la sortie supplémentaire qui ne fait pas partie du format CSV. Par défaut, la cmdlet écrit un en-tête avec des informations sur le type. Cela vous permet de connaître le type de l'objet lorsque vous le désérialisez ultérieurement avec la commande Import-Csv
mais cela perturbe les outils qui s'attendent à un CSV standard.
Le site -Path
fonctionne comme le paramètre -o
de sqlcmd.exe. Un chemin complet pour cette valeur est plus sûr si vous êtes coincé en utilisant l'ancienne version de SQLPS module.
Le site -Encoding
fonctionne comme le paramètre -f
ou -u
des paramètres de sqlcmd.exe. Par défaut, Export-Csv ne produit que des caractères ASCII et remplace tous les autres par des points d'interrogation. Utilisez plutôt UTF8 pour préserver 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 à modifier la commande pour obtenir un CSV valide. La cmdlet Export-Csv s'occupe de tout pour vous.
Le principal inconvénient est que Invoke-Sqlcmd
lit l'ensemble des résultats avant de les transmettre au pipeline. Assurez-vous que vous disposez de suffisamment de mémoire pour l'ensemble des résultats que vous souhaitez exporter.
Il se peut que cela ne fonctionne pas sans problème pour des milliards de rangs. Si c'est un problème, vous pouvez essayer les autres outils, ou créer votre propre version efficace de Invoke-Sqlcmd
en utilisant Système.Data.SqlClient.SqlDataReader classe.
0 votes
Cela doit-il se faire via sqlcmd, ou pouvez-vous utiliser un autre programme tel que le suivant : codeproject.com/KB/aspnet/ImportExportCSV.aspx
0 votes
Ce n'est pas forcément le cas, mais je voulais être certain que sqlcmd pouvait le faire avant de plonger dans un autre utilitaire d'exportation. Une chose à mentionner est qu'il doit être scriptable.
0 votes
Il existe un outil complémentaire SSMS 2008 qui permet d'obtenir une sortie CSV à partir de vos tables, qui peut être personnalisée par des clauses where et order by. store.nmally.com/software/sql-server-management-studio-addons/