web-dev-qa-db-fra.com

Écriture du résultat de sélection dans un fichier csv

Nous devons écrire les résultats de la requête SELECT dans un fichier csv. Comment le faire à l'aide de T-SQL dans SQL Server 2008 r2? Je sais que cela peut être fait dans SSIS, mais pour certaines raisons, nous n'avons pas cette option.

J'ai essayé d'utiliser le proc suggéré dans l'article ci-dessous, mais lorsque j'exécute le proc, SQL se plaint de ne pas pouvoir exécuter sys.sp_OACreate et sys.sp_OADestroy qui sont appelés dans ce proc.

Savez-vous comment nous pouvons activer ces composants ou connaissez-vous une meilleure façon d'écrire dans un fichier à l'aide de T-SQL?

Merci d'avance.

39
Sky

Utilisez tilitaire BCP

bcp "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" queryout "D:\MyTable.csv" -c -t , -S SERVERNAME -T

Le -c l'argument spécifie la sortie du caractère c , par opposition au format binaire natif de SQL; par défaut, les valeurs sont séparées par des tabulations, mais -t , change le champ t erminator en virgules. -T spécifie l'authentification Windows (" t connexion rouillée"), sinon utilisez -U MyUserName -P MyPassword.

Cela n'exporte pas les en-têtes de colonne par défaut. Vous devez utiliser UNION ALL pour les en-têtes

OR

Utiliser SQLCMD

SQLCMD -S SERVERNAME -E -Q "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable"
-s "," -o "D:\MyData.csv" 

OR

Utilisez Powershell

Voici un lien vers un article . Si vous finissez par utiliser cela, vous voudrez peut-être ajouter -notype après Export-Csv $extractFile pour supprimer la colonne inutile du fichier de sortie.

53
RK Kuppala

Ajout à la réponse précédente, qui vous aide à automatiser l'action, si vous en avez besoin de temps en temps, vous pouvez le faire dans Management Studio, simplement clic droit sur l'en-tête - Enregistrer les résultats sous -> choisissez un .csv fichier.

Ou si vous souhaitez le faire pour chaque instruction select que vous exécutez, vous pouvez modifier la direction de sortie des résultats dans un fichier. Utilisez Outils -> Options -> Résultats de la requête - Résultats dans le fichier.

Une autre façon, qui peut être automatisée facilement et utilise SSIS, consiste à utiliser la fonction d'exportation des données de Management Studio. Faites un clic droit sur la base de données -> Tâches -> Exporter les données. Il y a un assistant avec beaucoup d'options là-bas. Vous devez choisir la base de données source, la destination et d'autres options. Pour la destination, assurez-vous qu'il s'agit d'un "fichier plat", parcourez et choisissez le type .csv, choisissez le formatage dont vous avez besoin et à la fin, vous obtiendrez un package SSIS qui peut être enregistré localement et répété au besoin.

24
Marian

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 des en-têtes (HDR = YES), assurez-vous que la première ligne du fichier .CSV est une liste délimitée de tous les champs.

Faible technologie, mais ...

select
   col1 + ','
+  cast(col2 as varchar(10)) + ','
+  col3
from mytable;
5
Alain

Il semble que vous ayez déjà une solution acceptable, mais si vous avez configuré la messagerie db, vous pouvez potentiellement faire quelque chose comme ceci:

EXEC msdb.dbo.sp_send_dbmail
    @recipients='[email protected]',
    @subject='CSV Extract', 
    @body='See attachment',
    @query ='SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable',
    @attach_query_result_as_file = 1,
    @query_attachment_filename = 'CSV_Extract.txt',
    @query_result_separator = ',',
    @query_result_header = 1

Si vous envoyez le fichier par e-mail quelque part, cela peut vous faire économiser quelques étapes.

4
Shane Estelle

Cela peut facilement se faire en 3 étapes:

  1. Écrivez votre requête sous la forme d'un SELECT INTO requete. Cela exportera essentiellement les résultats de votre requête dans une table.

    Select
      Field1
     ,Field2
     ,Field3
    INTO dbo.LogTableName         --Table where the query Results get logged into.
    From Table
    

    Notez que cette table ne peut pas existe lorsque la requête s'exécute, car ce type de requête veut créer la table dans le cadre de l'exécution.

  2. Utilisez ensuite SSIS pour exporter les résultats de cette table vers .csv. L'assistant d'exportation SSIS vous permet de choisir votre délimiteur, etc. Ceci est vraiment pratique pour utiliser un | délimiteur dans les cas où le jeu de résultats contient des virgules.

    Clic droit sur DB Name > Tasks > Export Data

  3. Une fois l'exportation terminée, exécutez le DROP TABLE commande pour nettoyer votre table de journal.

    Drop Table dbo.LogTableName
    
1
Don Moehling

J'utilise MS Access DoCMD pour exporter des CSV depuis SQL Server. Il est capable de le faire avec une seule commande. La base de données d'accès est uniquement utilisée pour activer la commande d'accès. Il fonctionne bien et, comme avantage supplémentaire (vous ne savez pas pourquoi), il crée un schéma.ini pour la table exportée.

Adam

CMD="SELECT * INTO [Text;HDR=Yes;DATABASE=C:\].[Results.txt]  
FROM [ODBC;DSN=SQL2017;Description=SQL2017;UID=.;Trusted_Connection=Yes;APP=Microsoft Office 2013;WSID=LAPTOP-XYZ;DATABASE=TempDB_DataDump_1].Results "

 Set appAccess = CreateObject("Access.Application") 
                appAccess.OpenCurrentDatabase "anyAccessdatabase.mdb" 
                   ' appAccess.DoCmd.SetWarnings 0
                    appAccess.DoCmd.runsql "CMD"
0
Adam