Comment exporter des données au format CSV à partir de SQL Server à l'aide de l'utilitaire sqlcmd?
Je peux assez facilement les données d'image dans un fichier texte tels que:
sqlcmd -S myServer -d myDB -E -Q "select col1, col2, col3 from SomeTable"
-o "MyData.txt"
Cependant, j'ai regardé les fichiers d'aide pour SQLCMD
mais n'ont pas vu une option pour CSV.
Est-il un moyen de vider les données d'une table dans un fichier texte CSV à l'aide de SQLCMD
?
- Cela doit être via l'utilitaire sqlcmd, ou pourriez-vous utiliser un autre programme tel que le suivant: codeproject.com/KB/aspnet/ImportExportCSV.aspx
- Il n'a pas à être, mais je voulais savoir si ou de ne pas sqlcmd pourrait effectivement le faire avant de plonger dans un autre utilitaire d'exportation. Une chose à mentionner est qu'il n'a besoin d'être scriptable.
- Il y a un SSMS 2008 addin outil qui n'sortie CSV de vos tables qui peuvent être personnalisés par les clauses where et order by. store.nmally.com/software/sql-server-management-studio-addons/...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez exécuter quelque chose comme ceci:
-h-1
supprime le nom de la colonne en-têtes de la suite-s","
définit la colonne séparateur d' ,-w 700
définit la largeur de l'emprise de 700 caractères (ce qui devra être aussi large que la rangée la plus longue, ou il va automatiquement à la ligne suivante)'""' + col1 + '""' AS col1
, enveloppé dans (doublé) des guillemets ou tout simplement appeler une procédure stockée.Export-csv
.QUOTENAME
fonction pour chaque champ de texte):cat test_query.sql | { /opt/mssql-tools/bin/sqlcmd -S 192.168.2.58 -U sa -P topsecret -h-1 -s"," -W -i <(cat -); } | head -n 2
La dernière ligne contient CSV options spécifiques.
-W
supprimer les espaces à droite de chaque champ-s","
définit la colonne élément de séparation à la virgule (,)-w 999
définit la largeur de ligne à 999 caractèresscottm réponse est très proche de ce que j'utilise, mais je trouve la
-W
vraiment être un petit plus: je n'ai pas besoin de garniture espaces lorsque je consomme le CSV ailleurs.Également voir le MSDN sqlcmd de référence. Il met l'
/?
de l'option de sortie à la honte.'""' + col1 + '""' AS col1
, enveloppé dans (doublé) des guillemets ou tout simplement appeler une procédure stockée.Export-csv
.N'est-ce pas
bcp
était destiné?L'exécuter à partir de votre ligne de commande pour vérifier la syntaxe.
Par exemple:
S'il vous plaît, notez que
bcp
ne pouvez pas sortie en-têtes de colonne.Voir: Utilitaire bcp docs page.
Exemple à partir de la page mentionnée ci-dessus:
bcp
ne englobant l'en-tête (noms de colonne), mais c'est ~10X plus rapide quesqlcmd
(de mon expérience). De très grands volumes de données, vous pouvez utiliserbcp
pour obtenir les données, et l'utilisationsqlcmd
(select top 0 * à partir de ...) pour obtenir l'en-tête, et puis de les combiner.Avec PowerShell, vous pouvez résoudre le problème proprement par la tuyauterie Invoke-Sqlcmd dans l'Exportation au format Csv.
SQL Server 2016 comprend la SqlServer module, qui contient le
Invoke-Sqlcmd
applet de commande, qui vous aurez même si vous venez de vous installer SSMS 2016. Avant cela, SQL Server 2012 inclus le vieux SQLPS module, qui change le répertoire courant pourSQLSERVER:\
lorsque le module a été d'abord utilisé (entre autres bugs) donc pour cela, vous aurez besoin de changer la#Requires
ligne ci-dessus pour:D'adapter l'exemple de SQL Server 2008 et 2008 R2, retirez le
#Requires
ligne et utiliser le sqlps.exe utilitaire au lieu de la norme PowerShell hôte.Invoquer-Sqlcmd est l'équivalent de PowerShell sqlcmd.exe. Au lieu de texte, il sorties Système.Les données.DataRow objets.
La
-Query
paramètre fonctionne comme le-Q
paramètre de sqlcmd.exe. Transmettre une requête SQL qui décrit les données que vous souhaitez exporter.La
-Database
paramètre fonctionne comme le-d
paramètre de sqlcmd.exe. Passer le nom de la base de données qui contient les données à exporter.La
-Server
paramètre fonctionne comme le-S
paramètre de sqlcmd.exe. Passer le nom du serveur qui contient les données à exporter.L'exportation au format CSV est une applet de commande PowerShell qui sérialise des objets génériques au format CSV. Il est livré avec PowerShell.
La
-NoTypeInformation
paramètre supprime de sortie supplémentaire qui ne fait pas partie de l'exportation au 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érialiser plus tard avecImport-Csv
, mais il confond les outils qui attendent CSV standard.La
-Path
paramètre fonctionne comme le-o
paramètre de sqlcmd.exe. Un chemin d'accès complet pour cette valeur est la plus sûre si vous êtes coincé à l'aide de l'ancien SQLPS module.La
-Encoding
paramètre fonctionne comme le-f
ou-u
paramètres de sqlcmd.exe. Par défaut, l'Exportation au format Csv sorties uniquement des caractères ASCII et remplace tous les autres avec des points d'interrogation. L'utilisation de l'utf-8 au lieu de préserver tous les caractères et de rester compatible avec la plupart des autres outils.Le principal avantage de cette solution sur sqlcmd.exe ou bcp.exe c'est que vous n'avez pas de pirater la commande de sortie valide CSV. L'Export-Csv applet de commande s'occupe de tout pour vous.
Le principal inconvénient est que
Invoke-Sqlcmd
lit la totalité des résultats avant de passer le long du pipeline. Assurez-vous que vous avez assez de mémoire pour l'ensemble de l'ensemble de résultats que vous souhaitez exporter.Il peut ne pas fonctionner en douceur pour des milliards de lignes. Si c'est un problème, vous pouvez essayer les autres outils, ou de rouler votre propre version efficace de
Invoke-Sqlcmd
à l'aide de Système.Les données.SqlClient.SqlDataReader classe.Get-Location
renvoie toujours "SQLSERVER:\" lorsque vous exécutez à partirsqlps.exe
.Invoke-Sqlcmd
commande peut passer les lignes comme des objets dans le tuyau deExport-Csv
. Linux pipelines sont plus limités dans cet aspect, car ils sont juste un moyen de transfert d'octets brutes.Une remarque pour ceux qui cherchent à le faire, mais également les en-têtes de colonne, c'est la solution que j'ai utilisé un fichier de commandes:
Ce sorties les premiers résultats (y compris l' ----,---- séparateurs entre les en-têtes et les données) dans un fichier temporaire, puis supprime cette ligne par le filtrage par findstr. Notez qu'il n'est pas parfait, puisqu'il est le filtrage
-,-
—cela ne fonctionnera pas si il n'y a qu'une seule colonne de la sortie, et il sera également filtrer des lignes qui contiennent cette chaîne.Autre option avec BCP:
Cette réponse s'appuie sur la solution de @iain-frère, qui fonctionne bien, sauf pour la grande base de données de cas (comme l'a fait remarquer dans sa solution). L'ensemble de la table doit s'inscrire dans la mémoire de votre système, et pour moi ce n'était pas une option. Je crois que la meilleure solution serait d'utiliser la Système.Les données.SqlClient.SqlDataReader et personnalisé CSV sérialiseur (voir ici pour un exemple) ou une autre langue avec un MS SQL pilote et CSV de sérialisation. Dans l'esprit de la question d'origine qui était probablement à la recherche d'un pas de dépendance de la solution, le PowerShell code ci-dessous a fonctionné pour moi. Il est très lent et inefficace, en particulier dans l'instanciation de la variable $data array et en appelant à l'Exportation au format Csv en mode ajout pour chaque $chunk_size lignes.
Généralement
sqlcmd
est livré avecbcp
utilitaire (dans le cadre demssql-tools
) qui exporte en CSV par défaut.Utilisation:
Par exemple:
De vider tous les tableaux correspondants des fichiers CSV, voici la Bash script:
Une réponse au-dessus de presque résolu pour moi, mais il ne prend pas correctement en créer un analysée CSV.
Voici ma version:
Quelqu'un dire que
sqlcmd
est obsolète en faveur de certains PowerShell alternative, c'est d'oublier quesqlcmd
n'est pas seulement pour Windows. Je suis sur Linux (et quand sur Windows je éviter PS de toute façon).Après avoir dit tout cela, je trouve
bcp
plus facile.Depuis 2 raisons, vous devez exécuter ma solution dans CMD:
Login & mot de passe est parfois nécessaire d'interroger une instance distante de SQL Server
Vous pouvez le faire dans un hackish façon. Attention à l'aide de la
sqlcmd
hack. Si les données des guillemets ou des virgules, vous serez confronté à des problèmes.Vous pouvez utiliser un script simple pour le faire correctement:
Source: L'écriture SQL de sortie au format CSV avec VBScript.
sqlcmd
, on était juste en indiquant le fait que lessqlcmd
n'est pas correctement échapper à la virgule, c'est à peine utilisable pour tout grave sortie CSV.