Exporter le résultat de la requête vers un fichier .csv dans SQL Server 2008

141

Comment puis-je exporter un résultat de requête vers un fichier .csv dans SQL Server 2008?

Or
la source
Avez-vous besoin de votre délimiteur échappé? La plupart des réponses jusqu'à présent supposent que vous ne le faites pas, ce qui n'est pas vraiment tout ce que CSV.
Nick
@Nick - généralement les délimiteurs sont contenus avec une chaîne uniquement, et ils sont généralement entourés de guillemets. Voir ma réponse pour voir la solution à cela. stackoverflow.com/questions/6115054/…
MacGyver
J'utilise parfois Python
LV98

Réponses:

168
  1. Ouvrez SQL Server Management Studio
  2. Accédez à Outils> Options> Résultats de la requête> SQL Server> Résultats au texte
  3. À l'extrême droite, il y a une liste déroulante appelée Format de sortie
  4. Choisissez Délimité par des virgules et cliquez sur OK

Voici une version plein écran de cette image, ci-dessous

entrez la description de l'image ici

Cela affichera les résultats de votre requête sous forme de texte délimité par des virgules.

Pour enregistrer les résultats d'une requête dans un fichier: Ctrl + Maj + F

8 Ko
la source
10
La réponse est un peu trompeuse ... Lorsque vous appuyez sur Ctrl+Shift+F, cela ne change que le mode de sortie, cela n'affecte pas les résultats si vous avez déjà exécuté la requête. Pour que cela soit reflété, vous devez réexécuter la requête. Lorsque vous l'exécutez en mode "Résultats dans fichier", il devrait vous demander où vous souhaitez enregistrer les résultats.
qJake
3
Devrait être Aller dans Outils> Options> Résultats de la requête> SQL Server > Résultats au texte
congusbongus
45
Relancer la requête ne me suffisait pas. J'ai dû fermer la fenêtre de requête, en ouvrir une nouvelle, puis réexécuter la requête.
Breandán
3
Commentaire @ Breandán confirmé. Les nouveaux paramètres ne s'appliqueront pas à la fenêtre de requête actuellement ouverte, doivent les fermer et réexécuter la requête.
Shinigamae
3
Une chose que je devais faire était de l'exporter en tant qu'extension RPT par défaut. Après cela, vous pouvez simplement le renommer en CSV et cela fonctionne.
Thomas Bennett
140

Je sais que c'est un peu vieux, mais voici un moyen beaucoup plus simple ...

  1. Exécutez votre requête avec les paramètres par défaut (place les résultats au format grille, si votre requête n'est pas au format grille, voir ci-dessous)

  2. Faites un clic droit sur les résultats de la grille et cliquez sur "Enregistrer les résultats sous" et enregistrez-le.

Si vos résultats ne sont pas au format grille, faites un clic droit à l'endroit où vous écrivez la requête, passez la souris sur «Résultats vers» et cliquez sur «Résultats sur grille»

Sachez que vous ne capturez PAS les en-têtes de colonne!

Bonne chance!

Ricketts
la source
1
Le seul problème est que cette méthode ne semble pas vous permettre de définir des options. Par exemple, tous les NULL apparaissent dans les fichiers de sortie comme "NULL", etc. Il existe peut-être un moyen de définir cela que je ne connais pas, cependant.
Noah
13
Étonnamment, même dans SSMS 2012, cela ne cite pas correctement le texte pour CSV. Une virgule ou une nouvelle ligne dans un CHAR / VARCHAR doit être entre guillemets, mais ne l'est pas. Cela entraîne le déplacement des données dans de nouvelles colonnes ou dans une nouvelle ligne.
Eric J.
4
Ne vous donne pas non plus d'en-têtes de colonne.
Don
8
@Don cela donne des en-têtes de colonne si vous allez dans "Requête" -> "Options de requête ...", onglet de la grille, et cochez "Inclure les en-têtes de colonne lors de la copie ou de l'enregistrement des résultats"
Rob Wise
7
Cela devrait être la réponse.
pspahn
46

Vous pouvez utiliser PowerShell

$AttachmentPath = "CV File location"
$QueryFmt= "Query"

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $QueryFmt | Export-CSV $AttachmentPath
NS
la source
Je vous remercie! C'était la seule suggestion qui a fonctionné pour moi. Les poignées s'échappent correctement
emertechie
3
+10 si je pouvais. Seule réponse qui gère l'évasion. Pour que cela fonctionne, j'ai dû ajouter deux lignes en haut du script: Add-PSSnapin SqlServerCmdletSnapin100et Add-PSSnapin SqlServerProviderSnapin100.
Eric J.
si vous faites face à un délai d'expiration, ajoutez le délai d'expiration de la requête , par exempleInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo
1
En tant que débutant de Powershell, j'avais besoin d'installer le module SqlServer: Install-Module -Name SqlServer(mais je n'avais pas besoin d' insérer ces applets de commande). En outre, j'avais sauvé les commandes dans un script qui ne fonctionneraient pas jusqu'à ce que j'avais changé la politique d'exécution: Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser.
sandyscott
@sandyscott Je suis aussi un débutant Powershell, alors merci. Quoi qu'il en soit, je pense que dans ce cas, une RemoteSignedpolitique d'exécution suffira.
BigBother
14

Si la base de données en question est locale, ce qui suit est probablement le moyen le plus robuste d'exporter un résultat de requête vers un fichier CSV (c'est-à-dire vous donnant le plus de contrôle).

  1. Copiez la requête.
  2. Dans l'Explorateur d'objets, cliquez avec le bouton droit sur la base de données en question.
  3. Sélectionnez "Tâches" >> "Exporter les données ..."
  4. Configurez votre source de données et cliquez sur "Suivant".
  5. Choisissez "Fichier plat" ou "Microsoft Excel" comme destination.
  6. Spécifiez un chemin de fichier.
  7. Si vous travaillez avec un fichier plat, configurez-le comme vous le souhaitez. Si vous travaillez avec Microsoft Excel, sélectionnez «Excel 2007» (les versions précédentes ont une limite de lignes à 64 Ko)
  8. Sélectionnez "Ecrire une requête pour spécifier les données à transférer"
  9. Coller la requête de l'étape 1.
  10. Cliquez sur suivant >> revoir les mappages >> cliquez sur suivant >> sélectionnez "exécuter immédiatement" >> cliquez deux fois sur "terminer".

Après avoir parcouru ce processus de manière exhaustive, j'ai trouvé que ce qui suit était la meilleure option

Script PowerShell

$dbname = "**YOUR_DB_NAME_WITHOUT_STARS**"
$AttachmentPath = "c:\\export.csv"
$QueryFmt= @"
**YOUR_QUERY_WITHOUT_STARS**
"@

Invoke-Sqlcmd   -ServerInstance **SERVER_NAME_WITHOUT_STARS** -Database  $dbname -Query $QueryFmt | Export-CSV $AttachmentPath -NoTypeInformation

Exécutez PowerShell en tant qu'administrateur

& "c:\path_to_your_ps1_file.ps1"
pimbrouwers
la source
1
si vous faites face à un délai d'attente, ajoutez le délai d'attente de la requête , par exempleInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo
6

MS Excel -> Données -> Nouvelle requête -> À partir de la base de données .. suivez les étapes

tichra
la source
6

En m'appuyant sur la réponse de NS, j'ai un script PowerShell qui exporte vers un fichier CSV avec les guillemets autour du champ et séparés par des virgules et il ignore les informations d'en-tête dans le fichier.

add-pssnapin sqlserverprovidersnapin100
add-pssnapin sqlservercmdletsnapin100

$qry = @"
Select
  *
From
 tablename
"@

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $qry | convertto-CSV -notype | select -skip 1  > "full path and filename.csv"

Les deux premières lignes permettent d'utiliser la commande-let Invoke-SqlCmd .

BeowulfNode42
la source
6

Utilisez T-SQL :

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

Mais, il y a quelques mises en garde:

  1. Vous devez disposer du fournisseur Microsoft.ACE.OLEDB.12.0. Le fournisseur Jet 4.0 fonctionnera également, mais il est ancien, j'ai donc utilisé celui-ci à la place.

  2. Le fichier .CSV devra déjà exister. Si vous utilisez headers ( HDR=YES), assurez-vous que la première ligne du fichier .CSV est une liste délimitée de tous les champs.

Slogmeister Extraordinaire
la source
3

L'utilisation de la technique native de SQL Server Management Studio pour exporter au format CSV (comme @ 8 Ko suggéré) ne fonctionne pas si vos valeurs contiennent des virgules, car SSMS ne place pas les valeurs entre guillemets. Une manière plus robuste qui a fonctionné pour moi est de simplement copier les résultats (cliquez à l'intérieur de la grille, puis CTRL-A, CTRL-C) et collez-les dans Excel. Puis enregistrez en tant que fichier CSV à partir d'Excel.

Johnny Oshika
la source
2

Vous pouvez utiliser QueryToDoc ( http://www.querytodoc.com ). Il vous permet d'écrire une requête sur une base de données SQL et d'exporter les résultats - après avoir choisi le délimiteur - vers Excel, Word, HTML ou CSV

Robert
la source
2
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

comme @Slogmeister Extraordinaire Quoted est correct.

Un besoin d'avoir 1> Fichier déjà présent avec les colonnes 2> Un besoin d'avoir Office installé

Erreurs rencontrées

1

Msg 7303, niveau 16, état 1, ligne 1 Impossible d'initialiser l'objet de source de données du fournisseur OLE DB "Microsoft.ACE.OLEDB.12.0" pour le serveur lié "(null)". "

64 bits http://download.microsoft.com/download/2/4/3/24375141-E08D-4803-AB0E-10F2E3A07AAA/AccessDatabaseEngine_x64.exe

32 bits http://download.microsoft.com/download/f/d/8/fd8c20d8-e38a-48b6-8691-542403b91da1/AccessDatabaseEngine.exe

2

Msg 15281, niveau 16, état 1, ligne 1 SQL Server a bloqué l'accès à STATEMENT 'OpenRowset / OpenDatasource' du composant 'Ad Hoc Distributed Queries' car ce composant est désactivé dans le cadre de la configuration de sécurité pour ce serveur. Un administrateur système peut activer l'utilisation de «requêtes distribuées ad hoc» à l'aide de sp_configure. Pour plus d'informations sur l'activation des «requêtes distribuées ad hoc», recherchez «requêtes distribuées ad hoc» dans la documentation en ligne de SQL Server.

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 0
RECONFIGURE
GO
sam
la source
2

Si vous ne souhaitez pas utiliser Powershell, cette réponse est une variante de la bonne réponse de 8kb. La seule différence est qu'au lieu de sélectionner CSV comme format de sortie, sélectionnez Délimité par des tabulations. De cette façon, s'il y a des virgules dans vos données, cela ne sautera pas les cellules dans Excel. De plus, si le délimiteur par défaut d'Excel est défini sur des onglets, vous pouvez simplement copier tous les résultats de la requête SSMS (CTRL-A, CTRL-C) et les coller dans Excel (pas besoin d'enregistrer en tant que fichier et d'importer dans Excel ):

  • Dans SSMS, accédez à Outils> Options> Résultats de la requête> SQL Server> Résultats au texte
  • Changer le format de sortie à l'extrême droite en délimité par des tabulations
  • Cliquez sur OK

Maintenant, vous pouvez exécuter votre requête, puis faire un CTRL-A pour sélectionner tous les résultats, puis CTRL-C pour copier dans le presse-papiers, puis passer à Excel 2013 (peut également fonctionner en 2007, pas sûr) et coller - en supposant la valeur par défaut d'Excel le délimiteur est défini sur tabulation.

Image de l'écran des options de requête SSMS

TomWalker
la source
-1

Oui, tout cela est possible lorsque vous avez un accès direct aux serveurs. Mais que faire si vous n'avez accès au serveur qu'à partir d'un serveur Web / d'applications? Eh bien, la situation était la suivante avec nous il y a longtemps et la solution était l' exportation SQL Server vers CSV .

Jiju Thomas Mathew
la source
Lien ... Accès refusé?
hoggar