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.
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.
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.
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:
Faible technologie, mais ...
select
col1 + ','
+ cast(col2 as varchar(10)) + ','
+ col3
from mytable;
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.
Cela peut facilement se faire en 3 étapes:
É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.
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
Une fois l'exportation terminée, exécutez le DROP TABLE
commande pour nettoyer votre table de journal.
Drop Table dbo.LogTableName
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"