Je peux assez facilement vider des données dans un fichier texte tel 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 je n'ai pas vu d'option spécifiquement pour CSV.
Existe-t-il un moyen de vider les données d'une table dans un fichier texte CSV en utilisant SQLCMD
?
sql-server
file
csv
sqlcmd
Rayon
la source
la source
Réponses:
Vous pouvez exécuter quelque chose comme ceci:
-h-1
supprime les en-têtes de nom de colonne du résultat-s","
définit le séparateur de colonnes sur,-w 700
définit la largeur de la ligne à 700 caractères (cela devra être aussi large que la ligne la plus longue ou elle passera à la ligne suivante)la source
'""' + col1 + '""' AS col1
guillemets doubles (doublés) ou simplement appeler une procédure stockée.Avec PowerShell, vous pouvez résoudre le problème proprement en envoyant Invoke-Sqlcmd dans Export-Csv.
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 celuiSQLSERVER:\
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: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 avecImport-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 .la source
La dernière ligne contient des options spécifiques au CSV.
-W
supprimer les espaces de fin de chaque champ individuel-s","
définit le séparateur de colonnes sur la virgule (,)-w 999
définit la largeur de ligne à 999 caractèresLa réponse de scottm est très proche de ce que j'utilise, mais je trouve que
-W
c'est un ajout vraiment sympa: je n'ai pas besoin de couper les espaces lorsque je consomme le CSV ailleurs.Consultez également la référence MSDN sqlcmd . Cela fait
/?
honte à la sortie de l' option.la source
'""' + col1 + '""' AS col1
guillemets (doublés) ou simplement appeler une procédure stockée.N'est-ce pas
bcp
fait pour?Exécutez ceci à partir de votre ligne de commande pour vérifier la syntaxe.
Par exemple:
Veuillez noter que
bcp
ne peut pas afficher les en-têtes de colonne.Voir: page de documentation de l' utilitaire bcp .
Exemple de la page ci-dessus:
la source
bcp
n'inclut pas l'en-tête (noms de colonne), mais c'est ~ 10X plus rapide quesqlcmd
(d'après mon expérience). Pour un très gros volume de données, vous pouvez utiliserbcp
pour obtenir les données, et utilisersqlcmd
(sélectionner top 0 * de ...) pour obtenir l'en-tête, puis les combiner.Une note pour tous ceux qui cherchent à faire cela mais aussi les en-têtes de colonne, c'est la solution que j'ai utilisée dans un fichier batch:
Cela génère les résultats initiaux (y compris les séparateurs ----, ---- entre les en-têtes et les données) dans un fichier temporaire, puis supprime cette ligne en la filtrant via findstr. Notez que ce n'est pas parfait car il est filtré
-,-
- cela ne fonctionnera pas s'il n'y a qu'une seule colonne dans la sortie, et il filtrera également les lignes légitimes qui contiennent cette chaîne.la source
Cette réponse s'appuie sur la solution de @ iain-aîné, qui fonctionne bien sauf pour le cas de la grande base de données (comme indiqué dans sa solution). La table entière doit tenir dans la mémoire de votre système, et pour moi ce n'était pas une option. Je soupçonne que la meilleure solution utiliserait System.Data.SqlClient.SqlDataReader et un sérialiseur CSV personnalisé ( voir ici pour un exemple ) ou un autre langage avec un pilote MS SQL et une sérialisation CSV. Dans l'esprit de la question originale qui cherchait probablement une solution sans dépendance, le code PowerShell ci-dessous a fonctionné pour moi. Il est très lent et inefficace, en particulier pour instancier le tableau $ data et appeler Export-Csv en mode ajout pour chaque ligne $ chunk_size.
la source
Option alternative avec BCP:
la source
Livré généralement
sqlcmd
avec unbcp
utilitaire (dans le cadre demssql-tools
) qui exporte au format CSV par défaut.Usage:
Par exemple:
Pour vider toutes les tables dans les fichiers CSV correspondants, voici le script Bash :
la source
Une réponse ci-dessus l'a presque résolu pour moi, mais elle ne crée pas correctement un CSV analysé.
Voici ma version:
Quelqu'un qui dit que
sqlcmd
c'est obsolète en faveur d'une alternative PowerShell oublie que cesqlcmd
n'est pas seulement pour Windows. Je suis sous Linux (et sous Windows, j'évite de toute façon PS).Cela dit, je trouve
bcp
plus facile.la source
Depuis 2 raisons suivantes, vous devez exécuter ma solution dans CMD:
Le nom d'utilisateur et le mot de passe de connexion sont parfois nécessaires pour interroger une instance SQL Server distante
la source
Vous pouvez le faire de manière piratée. Attention en utilisant le
sqlcmd
hack. Si les données comportent des guillemets ou des virgules, vous rencontrerez des problèmes.Vous pouvez utiliser un simple script pour le faire correctement:
Source: Ecriture de la sortie SQL au format CSV avec VBScript .
la source
sqlcmd
, nous disions simplement que celasqlcmd
n'échappait pas correctement à la virgule, ce qui était à peine utilisable pour une sortie CSV sérieuse .