J'ai une requête que j'exécute dans SQL Server Management Studio (connexion à une base de données SQL Server 2005). Je veux exporter les données au format CSV. Vous ne devez pas utiliser le format CSV, où vous insérez juste une virgule entre chaque colonne, mais le "vrai" format CSV, dans lequel vous mettez des guillemets autour de vos chaînes. De cette façon, vous pouvez exporter des données contenant des virgules ou des virgules.
Tous les exemples que je vois se limitent au format Wannabe. Je ne peux pas comprendre où l'option de citer des chaînes est.
Si SSMS est vraiment incapable de réaliser cet exploit de base, existe-t-il d'autres outils qui le feront facilement? Je ne veux pas avoir à écrire un programme C # chaque fois que j'ai besoin d'un vidage de données.
Dans SSMS 2012, il existe une option pour cela, dans Outils -> Options -> Résultats de la requête -> SQL Server -> Résultats dans la grille, elle s'appelle "Chaînes de devis contenant des séparateurs de liste lors de l'enregistrement des résultats .csv". Je ne sais pas combien de temps une telle option existe, mais je suis déconcerté par deux choses:
Cela défie juste de croire que le comportement par défaut est d'exporter au format CSV qu'il est impossible d'importer correctement. J'ai remarqué qu'Excel fait la même chose, je vais devoir voir si cela a aussi une option.
Entre-temps, merci à mon collègue de m'avoir signalé cette fonctionnalité bizarre lorsque je disais à quel point l'exportateur de fichiers CSV était totalement inutile et que c'était le meilleur lien que j'avais trouvé à ce sujet. la connaissance ici au profit des futurs chercheurs.
METTRE À JOUR
Mon travail habituel consiste à l'intégrer à la requête:
SELECT '"' + REPLACE(CAST(column AS NVARCHAR(4000)), '"', '""') + '"' AS Header, ... FROM ...
Vous pouvez l'intégrer dans une fonction définie par l'utilisateur, pour la simplifier un peu, mais vous devez créer une fonction distincte pour chaque type de données.
Différentes combinaisons de ces paramètres peuvent générer des résultats de données incorrectes ou partielles. En effet, Microsoft ne pensait pas que c'était assez important pour résoudre ces problèmes. J'explique seulement ce qui se passe avec les fichiers CSV lors de l'envoi des résultats dans un fichier.
Pour obtenir de bons résultats, procédez comme suit:
Ouvre une nouvelle fenêtre de requête (nouvel onglet/session) ... sinon, la configuration ci-dessous est perdue et rétablie aux valeurs par défaut
Ecrivez la requête pour gérer la citation à l'intérieur de la citation et mettez également tous les types de données de chaîne entre guillemets. Sachez également que différentes grammaires de SGBD et de langages de programmation acceptent une syntaxe différente pour un guillemet double échappé (si vous utilisez cette sortie comme entrée d'un autre système). Certains utilisent \"
. Certains utilisent ""
. XML utilise "
;. Probablement une raison pour laquelle Microsoft a choisi d'ignorer cette fonctionnalité, afin de ne pas avoir à traiter les arguments.
.. Si la séquence d'échappement du nouveau système est ""
.
SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '""') + '"' FROM table1
.. Si la séquence d'échappement du nouveau système est \"
.
SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '\"') + '"' FROM table1
Configuration:
Options de requête> Résultats> "Inclure les en-têtes de colonne lors de la copie ou de l'enregistrement des résultats" coché
Options de requête> Résultats> "Chaînes de devis contenant des séparateurs de liste lors de la sauvegarde des résultats .csv" - BROKEN; NE PAS UTILISER!
Options de requête> Résultats> Autres non cochés
Options de requête> Résultats> Texte> séparés par des virgules (paramètres situés dans le coin supérieur droit)
Options de requête> Résultats> Texte> "Inclure les en-têtes de colonne dans le jeu de résultats" cochée
Options de requête> Résultats> Texte> Autres non cochés
Options de requête> Résultats> Texte> "Nombre maximal de caractères affichés dans chaque colonne": définissez la longueur maximale afin que les chaînes ne soient pas tronquées.
Requête> Résultats dans un fichier (il s'agit d'une bascule entre les 3 options)
Exécuter la requête (F5)
Demander le nom du fichier du rapport
Ouvrir le fichier pour regarder les résultats
NOTE: Si vous avez besoin de le faire régulièrement, vous êtes mieux lotis juste en développant un programme qui le fera pour vous dans .NET ou Java, ou quelle que soit la langue avec laquelle vous êtes à l'aise. Sinon, vous avez un forte probabilité de faire une erreur. Alors soyez extrêmement conscient de la syntaxe du système dans lequel vous importez, avant de définir votre fichier exporter hors de SQL Server.
Que pensez-vous de Exporter au format CSV à partir de SSMS via PowerShell ? Cet article décrit comment définir un outil externe dans SSMS qui envoie la requête actuellement sélectionnée à un script PowerShell qui exporte vers un fichier CSV.
C'est triste que l'option soit disponible dans un état déroutant, mais pas parfaitement opérationnel. Ce qui suit fonctionne au moins.
text qualifier
comme guillemet doublevous devriez être prêt à partir!
Je ne connais aucun moyen de faire cela avec SSMS seul. Je sais que TOAD (http://www.toadworld.com/) a une option CSV. Pas sûr que ce soit un format échappé. Si SSIS est une option, vous pouvez convertir en un format qui échappe aux chaînes (true CSV), mais ce n'est pas dans SSMS.
Si vous devez écrire un programme C #, j’envisagerais d’interroger la table, puis de l'exécuter, car les métadonnées indiqueront le besoin de s'échapper.
Tous les paramètres mentionnés ci-dessus ne corrigeant pas le CSV généré par mon SSMS (SQL Server 2014) et l'exportation d'un fichier séparé par des tabulations ne le rendant pas meilleur, un collègue et moi avons créé un script de conversion (Ruby) pour convertir le SSMS. CSV en fichier CSV lisible . Il conserve l’encodage, les séparateurs et les sauts de ligne du fichier original et effectue même une validation exacte de la correspondance octet par octet (il crée un fichier au format SSMS à partir du fichier d’entrée analysé (!) Et compare les deux fichiers).
https://Gist.github.com/gr8bit/62202ea89a7e3aff67df2ff080ee8e88
Contactez-moi sur github si vous rencontrez des erreurs, s'il vous plaît. À votre santé!
Cela ne fonctionnera peut-être pas pour votre application, mais je règle généralement ce problème en exportant au format délimité par des tabulations. Ne négligez pas cette solution simple si elle s’applique à vous.
D'habitude j'utilise ce genre de fonction:
CREATE FUNCTION [dbo].[toExport]
(
@txt varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
return REPLACE(REPLACE(REPLACE(@txt, ';', ','), CHAR(10), ' '), CHAR(13), ' ');
END
Et dans select je le mets ici:
SELECT dbo.toExport( column_name ) AS column_name FROM ....
Et dans SMSS 2012, cliquez simplement sur une grille et enregistrez les résultats sous, ou copiez toutes les grilles (ctrl-A) et ctrl-V dans Excel.
C'est le moyen le plus simple de gérer les données dans MS Excel, par exemple, sans problème de colonnes.
Vous devez bien sûr cliquer sur "Chaînes de devis contenant des séparateurs de liste lors de l'enregistrement des résultats .csv" dans Outils -> Options -> Résultats de la requête -> Serveur SQL -> Résultats dans la grille et augmenter le nombre maximal de caractères extraits si vous en avez besoin.
Je pense que le plus simple est d'ouvrir Excel et d'importer les données depuis une connexion SQL plutôt que d'utiliser SSMS Export .... J'utilise SSMS 2016 et il n'a pas l'option "Chaînes de devis contenant des séparateurs de liste lors de l'enregistrement. résultats csv "probablement parce que ça ne marche pas
Ron