Nous devons écrire les résultats de la requête SELECT dans un fichier csv. Comment cela peut-il être fait en utilisant T-SQL dans SQL Server 2008 r2? Je sais que cela peut être fait dans SSIS, mais pour certaines raisons, nous navons pas cette option.
Jai essayé dutiliser la procédure suggérée dans larticle ci-dessous, mais lorsque jexécute la procédure, 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 en utilisant T-SQL?
Merci davance.
Réponse
Utilisez Utilitaire BCP
bcp "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" queryout "D:\MyTable.csv" -c -t , -S SERVERNAME -T
Largument -c
spécifie c sortie haracter, par opposition au format binaire natif de SQL; par défaut, les valeurs sont séparées par des tabulations, mais -t ,
remplace le champ t erminator par des virgules. -T
spécifie lauthentification Windows (« t rusted connection « ), sinon utilisez -U MyUserName -P MyPassword
.
Cela nexporte pas les en-têtes de colonne par défaut. Vous devez utiliser UNION ALL pour les en-têtes
OU
Utilisez SQLCMD
SQLCMD -S SERVERNAME -E -Q "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" -s "," -o "D:\MyData.csv"
OU
Utilisez Powershell
Voici un lien vers un article . Si vous finissez par utiliser cela, vous pouvez ajouter -notype
après Export-Csv $extractFile
pour supprimer la colonne inutile du fichier de sortie.
Commentaires
- +1 Pour lutilitaire BCP – il est très facile à utiliser, cest loutil le plus rapide que jai jamais utilisé pour lexportation / limportation informations et il existe de nombreuses options. Je vous conseille dajouter » > FileName.log » à la fin de la déclaration – cela créera un fichier journal.
- Toute réponse impliquant un programme GUI est tout simplement hors de portée. Cest la meilleure solution dun point de vue DBA!
Réponse
Ajout à la réponse précédente, qui vous aide à automatiser laction, si vous nen avez besoin que de temps en temps, vous pouvez le faire dans Management Studio, il vous suffit de faire un clic droit sur len-tête – Enregistrer les résultats sous -> choisir un. csv file .
Ou si vous voulez faire cela pour chaque instruction select que vous exécutez, vous pouvez changer 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é facilement et utilise SSIS, en utilisant la fonction Exporter les données de Management Studio. Cliquez avec le bouton droit sur la base de données -> Tâches -> Exporter les données. Il existe un assistant avec de nombreuses options. Vous devez choisir la base de données source, la destination et dautres options. Pour la destination, assurez-vous que cest « Fichier plat », parcourez et choisissez le type .csv , choisissez la mise en forme dont vous avez besoin et à la fin, vous « obtiendrez un package SSIS qui pourra être enregistré localement et répété au besoin.
Réponse
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 ya « quelques mises en garde:
- Vous devez avoir le fournisseur Microsoft.ACE.OLEDB.12.0 disponible. Le fournisseur Jet 4.0 fonctionnera également, mais il est ancien, alors jai utilisé celui-ci à la place.
- 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.
Commentaires
- Meilleure réponse donc loin!
- excellent travail, y compris des mises en garde
- Une autre mise en garde: vous devrez peut-être des autorisations, sinon vous verrez: Msg 15281, niveau 16, état 1, ligne 2 SQL Server a bloqué laccès à ÉNONCÉ ‘ OpenRowset / OpenDatasource ‘ du composant ‘ Requêtes distribuées ad hoc ‘ car ce composant est désactivé dans le cadre de la configuration de sécurité de ce serveur. Un administrateur système peut activer lutilisation de ‘ Requêtes distribuées ad hoc ‘ à laide de sp_configure. Pour plus dinformations sur lactivation des ‘ Requêtes distribuées ad hoc ‘, recherchez ‘ Ad Hoc Requêtes distribuées ‘ dans la documentation en ligne de SQL Server.
Réponse
Faible technologie, mais …
select col1 + "," + cast(col2 as varchar(10)) + "," + col3 from mytable;
Commentaires
- MySQL traite
col1 + ',' + cast(col2 as varchar(10)) + ',' + col3
comme nom de colonne et affiche NULL partout.
Réponse
Il semble que vous ayez déjà une solution acceptable, mais si vous avez configuré db mail, vous pourrait 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 quelque part de toute façon, cela pourrait vous éviter quelques étapes.
Commentaires
- Juste ce que je cherchais, bravo à vous!
- Bien que vous deviez ajouter le paramètre @profile_name si vous navez pas de profil privé par défaut pour votre utilisateur ni profil public pour la base de données.
Réponse
Cela peut facilement être fait en 3 étapes processus:
-
Écrivez votre requête sous forme de requête
SELECT INTO
. 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
Remarque, cette table ne peut pas existe lorsque la requête sexécute, car ce type de requête souhaite créer la table dans le cadre de lexécution.
-
Ensuite, utilisez SSIS pour exporter les résultats de cette table à
.csv
. Lassistant dexportation SSIS vous permet de choisir votre délimiteur, etc. Cest vraiment pratique pour utiliser un | délimiteur dans les cas où le jeu de résultats contient des virgules.Faites un clic droit sur
DB Name > Tasks > Export Data
-
Une fois lexportation terminée, exécutez le
DROP TABLE
pour nettoyer votre table de journal.Drop Table dbo.LogTableName
Commentaires
- Salut Don. Jai ajouté une mise en forme à votre réponse. Vous pouvez cliquer sur ‘ modifier ‘ en bas à gauche pour voir ce que ‘ s modifié et cliquez sur le bit » modifié » xx minutes » pour afficher un historique complet si vous souhaitez revenir en arrière. Bien que réalisable, votre réponse n’ajoute pas ‘ beaucoup par rapport à ce que ‘ a déjà été écrit et n’attirera probablement pas beaucoup l’attention. >
Réponse
Cette procédure va générer un fichier CSV avec la sortie de la requête que vous passez en paramètre. Le deuxième paramètre est le nom de votre fichier CSV, assurez-vous de transmettre le nom de fichier avec un chemin daccès inscriptible valide.
Voici le script pour créer la procédure:
CREATE procedure [dbo].[usp_create_csv_file_from_query] @sql Nvarchar(MAX), @csvfile Nvarchar(200) as BEGIN if IsNull(@sql,"") = "" or IsNull(@csvfile,"") = "" begin RAISERROR ("Invalid SQL/CsvFile values passed!; Aborting...", 0, 1) WITH NOWAIT return end DROP TABLE if exists global_temp_CSVtable; declare @columnList varchar(4000), @columnList1 varchar(4000), @sqlcmd varchar(4000), @dos_cmd nvarchar(4000) set @sqlcmd = replace(@sql, "from", "into global_temp_CSVtable from") EXECUTE (@sqlcmd); declare @cols table (i int identity, colname varchar(100)) insert into @cols select column_name from information_schema.COLUMNS where TABLE_NAME = "global_temp_CSVtable" declare @i int, @maxi int select @i = 1, @maxi = MAX(i) from @cols while(@i <= @maxi) begin select @sql = "alter table global_temp_CSVtable alter column [" + colname + "] VARCHAR(max) NULL" from @cols where i = @i exec sp_executesql @sql select @i = @i + 1 end SELECT @columnList = COALESCE(@columnList + """, """, "") + column_name ,@columnList1 = COALESCE(@columnList1 + ", ", "") + column_name from information_schema.columns where table_name = "global_temp_CSVtable" ORDER BY ORDINAL_POSITION; SELECT @columnList = """" + @columnList + """"; SELECT @dos_cmd="BCP "SELECT " + @columnList + " UNION ALL " + "SELECT * from " + db_name() + "..global_temp_CSVtable" " + "QUERYOUT " + @csvfile + " -c -t, -T" exec master.dbo.xp_cmdshell @dos_cmd, No_output DROP TABLE if exists global_temp_CSVtable; end
Commentaires
- les réponses au code uniquement ne sont ‘ pas considérées comme acceptables ici – pourriez-vous ajouter quelques commentaires sur votre réponse et pourquoi cela fonctionne? (les commentaires de code aideraient probablement ici aussi)
- Oui, et pourriez-vous également ajouter un exemple de la façon dont vous lutilisez avec succès?
Réponse
Jutilise 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 daccès nest utilisée que pour activer la commande daccès. Il fonctionne bien, et comme avantage supplémentaire (je ne sais pas pourquoi), il crée un schema.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"