web-dev-qa-db-fra.com

Comment obtenir une sortie d'exportation au format "réel" CSV dans SQL Server Management Studio?

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.

58
Peter Recore

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:

  1. Comment se fait-il qu'il ne soit pas activé par défaut
  2. Comment se fait-il que ce soit une option et non une partie intrinsèque du code d'exportation CSV

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

Une capture d'écran ci-dessous:  enter image description here

106
Matthew Walton

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.

10
Joel Coehoorn

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 &quot ;. 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.

7
MacGyver

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.

4
billinkc

C'est triste que l'option soit disponible dans un état déroutant, mais pas parfaitement opérationnel. Ce qui suit fonctionne au moins.

  1. Choisissez "Tâches> Exporter les données" dans le menu contextuel de la base de données (ne fonctionne pas non plus au niveau de la table).
  2. Pour Source, choisissez "Fournisseur de bases de données Microsoft OLE pour SQL Server".
  3. Pour la destination, choisissez "Fichier plat ...", et spécifiez "Format" comme délimité et text qualifier comme guillemet double
  4. Sélectionnez une table ou une requête (j'ai travaillé avec une requête)
  5. Terminer l'assistant

vous devriez être prêt à partir! 

3
Sumesh R

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.

1
Gregory A Beamer

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é!

1
Niklas B.

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.

1
Brian Wirt

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.

1
Maciej Niemir

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

0
ron