Dobbiamo scrivere i risultati della query SELECT in un file csv. Come può essere fatto utilizzando T-SQL in SQL Server 2008 r2? So che può essere fatto in SSIS, ma per alcuni motivi non abbiamo questa opzione.
Ho provato a utilizzare il proc suggerito nellarticolo seguente, ma quando eseguo il proc, SQL si lamenta che non può eseguire sys.sp_OACreate e sys.sp_OADestroy che sono chiamati in questo processo.
Sai come possiamo attivare questi componenti o conosci un modo migliore per scrivere su un file usando T-SQL?
Grazie in anticipo.
Rispondi
Utilizza Utilità BCP
bcp "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" queryout "D:\MyTable.csv" -c -t , -S SERVERNAME -T
Largomento -c
specifica c output di haracter, al contrario del formato binario nativo di SQL; il valore predefinito è valori separati da tabulazione, ma -t ,
modifica il campo t erminator in virgole. -T
specifica lautenticazione di Windows (“ t connessione arrugginita “), altrimenti utilizza -U MyUserName -P MyPassword
.
Questo non esporta le intestazioni di colonna per impostazione predefinita. Devi usare UNION ALL per le intestazioni
OR
Usa SQLCMD
SQLCMD -S SERVERNAME -E -Q "SELECT Col1,Col2,Col3 FROM MyDatabase.dbo.MyTable" -s "," -o "D:\MyData.csv"
OR
Usa Powershell
Ecco un link a un articolo . Se finisci per usarlo, potresti voler aggiungere -notype
dopo Export-Csv $extractFile
per eliminare la colonna non necessaria nel file di output.
Commenti
- +1 Per lutilità BCP – è molto facile da usare, è lo strumento più veloce che io abbia mai usato per lesportazione / importazione informazioni e ci sono molte opzioni. Ti consiglio di aggiungere ” > FileName.log ” alla fine del istruzione – questo creerà un file di registro.
- Qualsiasi risposta che coinvolge un programma GUI è semplicemente fuori portata. Questa è la migliore soluzione dal punto di vista DBA!
Risposta
Aggiungendo alla risposta precedente, che ti aiuta ad automatizzare lazione, se ne hai bisogno solo di tanto in tanto puoi farlo in Management Studio, semplicemente fai clic destro sullintestazione – Salva risultati con nome -> scegli un file. csv .
Oppure, se vuoi farlo per ogni istruzione select che esegui, puoi cambiare la direzione di output dei risultati in un file. Utilizza Strumenti -> Opzioni -> Risultati query – Risultati nel file .
Un altro modo, che può essere automatizzato facilmente e fa uso di SSIS, è utilizzando la funzione di esportazione dei dati di Management Studio. Fare clic con il pulsante destro del mouse sul database -> Attività -> Esporta dati. Cè una procedura guidata con molte opzioni. Dovresti scegliere il database di origine, la destinazione e altre opzioni. Per la destinazione assicurati che sia “s” File flat “, sfoglia e scegli il tipo .csv , scegli la formattazione di cui hai bisogno e alla fine otterrai un pacchetto SSIS che può essere salvato localmente e ripetuto se necessario.
Risposta
Usa 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
Ma ci “un paio di avvertenze:
- Devi avere il provider Microsoft.ACE.OLEDB.12.0 disponibile. Anche il provider Jet 4.0 funzionerà, ma è vecchio, quindi ho usato questo invece.
- Il file .CSV dovrà già esistere. Se stai utilizzando le intestazioni (HDR = YES) , assicurati che la prima riga del file .CSV sia un elenco delimitato di tutti i campi.
Commenti
- Migliore risposta quindi lontano!
- ottimo lavoro inclusi avvertimenti
- Un ulteriore avvertimento: potresti aver bisogno delle autorizzazioni, altrimenti vedrai: Messaggio 15281, livello 16, stato 1, riga 2 SQL Server ha bloccato laccesso a STATEMENT ‘ OpenRowset / OpenDatasource ‘ del componente ‘ Query distribuite ad hoc ‘ perché questo componente è disattivato come parte della configurazione di sicurezza per questo server. Un amministratore di sistema può abilitare luso di ‘ Query distribuite ad hoc ‘ utilizzando sp_configure. Per ulteriori informazioni sullattivazione di ‘ query distribuite ad hoc ‘, cerca ‘ ad hoc Query distribuite ‘ nella documentazione in linea di SQL Server.
Risposta
Bassa tecnologia, ma …
select col1 + "," + cast(col2 as varchar(10)) + "," + col3 from mytable;
Commenti
- MySQL tratta
col1 + ',' + cast(col2 as varchar(10)) + ',' + col3
come nome di colonna e stampa NULL ovunque.
Risposta
Sembra che tu abbia già una soluzione accettabile, ma se hai impostato la posta db potrebbe potenzialmente fare qualcosa di simile:
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
Se stai comunque inviando il file tramite e-mail, potresti risparmiare alcuni passaggi.
Commenti
- Proprio quello che stavo cercando, complimenti a te!
- Anche se dovrai aggiungere il parametro @profile_name se non hai un profilo privato predefinito per il tuo utente né profilo pubblico per il database.
Risposta
Questo può essere fatto facilmente in tre passaggi processo:
-
Scrivi la tua query come
SELECT INTO
query. Questo essenzialmente esporterà i risultati della query in una tabella.Select Field1 ,Field2 ,Field3 INTO dbo.LogTableName --Table where the query Results get logged into. From Table
Nota, questa tabella non può esiste quando la query viene eseguita, poiché questo tipo di query vuole creare la tabella come parte dellesecuzione.
-
Quindi usa SSIS per esportare i risultati di quella tabella in
.csv
. La procedura guidata di esportazione SSIS ti consente di scegliere il delimitatore, ecc. Questo è davvero utile per lutilizzo di un | delimitatore nelle istanze in cui il set di risultati contiene virgole.Fai clic con il pulsante destro del mouse su
DB Name > Tasks > Export Data
-
Una volta completata lesportazione, esegui
DROP TABLE
comando per pulire la tabella dei log.Drop Table dbo.LogTableName
Commenti
- Ciao Don. Ho aggiunto un po di formattazione alla tua risposta. Puoi fare clic su ‘ modifica ‘ in basso a sinistra per vedere cosa ‘ modificato e fai clic sul bit ” modificato ” xx minuti ” per visualizzare una cronologia completa se vuoi tornare indietro. Sebbene realizzabile, la tua risposta non ‘ aggiunge molto a ciò che ‘ è già stato scritto ed è improbabile che attiri molta attenzione.
Risposta
Questa procedura genererà un file CSV con loutput della query che passi come parametro. Il secondo parametro è il nome del file CSV, assicurati di passare il nome del file con un percorso scrivibile valido.
Ecco lo script per creare la procedura:
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
Commenti
- risposte solo codice aren ‘ t visto come accettabile qui – potresti aggiungere qualche commento alla tua risposta e perché funziona? (i commenti sul codice probabilmente aiuterebbero anche qui)
- Sì, e potresti anche aggiungere un esempio su come utilizzarlo con successo?
Risposta
Uso MS Access DoCMD per esportare CSV da SQL Server. È in grado di farlo con un singolo comando. Il database di accesso viene utilizzato solo per abilitare il comando di accesso. Funziona bene e come ulteriore vantaggio (non so perché) crea uno schema.ini per la tabella esportata.
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"