Esporta il risultato della query nel file .csv in SQL Server 2008


141

Come posso esportare un risultato della query in un file .csv in SQL Server 2008?



Hai bisogno che il tuo delimitatore sia fuggito? La maggior parte delle risposte finora presume che tu non lo faccia, il che non è proprio tutto quel CSV.
Nick,

@Nick: in genere i delimitatori sono contenuti solo con una stringa e in genere contengono virgolette. Vedi la mia risposta per vedere la soluzione a questo. stackoverflow.com/questions/6115054/…
MacGyver,


A volte uso Python
LV98

Risposte:


168
  1. Apri SQL Server Management Studio
  2. Vai su Strumenti> Opzioni> Risultati della query> SQL Server> Risultati sul testo
  3. All'estrema destra, c'è una casella a discesa chiamata Formato output
  4. Scegli Delimitato da virgola e fai clic su OK

Ecco una versione a schermo intero di quell'immagine, di seguito

inserisci qui la descrizione dell'immagine

Questo mostrerà i risultati della tua query come testo delimitato da virgole.

Per salvare i risultati di una query in un file: Ctrl + Maiusc + F


10
La risposta è un po 'fuorviante ... Quando si preme Ctrl+Shift+F, cambia solo la modalità di output, non influisce sui risultati se è già stata eseguita la query. Affinché ciò si rifletta, è necessario rieseguire la query. Quando lo esegui in modalità "Risultati su file", ti verrà chiesto dove desideri salvare i risultati.
qJake

3
Dovresti andare su Strumenti> Opzioni> Risultati della query> SQL Server > Risultati in testo
congusbongus,

45
Rieseguire la query non è stato abbastanza per me. Ho dovuto chiudere la finestra della query, aprirne una nuova ed eseguire nuovamente la query.
Breandán,

3
Commento @ Breandán confermato. Le nuove impostazioni non si applicano alla finestra della query attualmente aperta, devono chiuderle ed eseguire nuovamente la query.
Shinigamae,

3
Una cosa che dovevo fare era esportarla come estensione RPT predefinita. Dopo averlo fatto, puoi semplicemente rinominarlo in un CSV e funziona.
Thomas Bennett,

140

So che è un po 'vecchio, ma qui è un modo molto più semplice ...

  1. Esegui la query con le impostazioni predefinite (inserisce i risultati in formato griglia, se il tuo non è in formato griglia, vedi sotto)

  2. Fare clic destro sui risultati della griglia e fare clic su "Salva risultati con nome" e salvarlo.

Se i risultati non sono in formato griglia, fai clic con il pulsante destro del mouse sul punto in cui scrivi la query, passa con il mouse su "Risultati in" e fai clic su "Risultati in griglia"

Ricorda di NON catturare le intestazioni di colonna!

In bocca al lupo!


1
L'unico problema è che questo metodo sembra non permetterti di impostare alcuna opzione. Ad esempio, tutti i NULL vengono visualizzati nei file di output come "NULL", ecc. Forse esiste un modo per impostare ciò che non conosco, tuttavia.
Noè,

13
Sorprendentemente anche in SSMS 2012, questo non cita correttamente il testo per CSV. Una virgola o una nuova riga all'interno di un CHAR / VARCHAR devono essere quotate, ma non lo è. Ciò causa lo spostamento dei dati in nuove colonne o in una nuova riga.
Eric J.

4
Inoltre non ti dà le intestazioni di colonna.
Don

8
@Don questo fornisce intestazioni di colonna se vai in "Query" -> "Opzioni di query ...", scheda della griglia e seleziona "includi le intestazioni di colonna quando copi o salvi i risultati"
Rob Wise,

7
Questa dovrebbe essere la risposta.
pspahn,

46

È possibile utilizzare PowerShell

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

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $QueryFmt | Export-CSV $AttachmentPath

Grazie! Questo è stato l'unico suggerimento che ha funzionato per me. Maniglie che fuoriescono correttamente
emertechie

3
+10 se potessi. Solo una risposta che gestisce la fuga. Per farlo funzionare, ho dovuto aggiungere due righe nella parte superiore dello script: Add-PSSnapin SqlServerCmdletSnapin100e Add-PSSnapin SqlServerProviderSnapin100.
Eric J.

in caso di timeout, aggiungi querytimeout , ad es.Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

1
Come novizio di Powershell avevo bisogno di installare il Modulo SqlServer: Install-Module -Name SqlServer(ma non avevo bisogno di agganciare quei Cmdlet). Inoltre, avevo salvato i comandi in uno script, che non avrebbe eseguito fino a quando avessi cambiato il criterio di esecuzione: Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser.
sandyscott,

@sandyscott Sono anche un principiante di Powershell, quindi grazie. Comunque penso che in questo caso RemoteSignedbasterà una politica di esecuzione.
BigBother il

14

Se il database in questione è locale, il seguente è probabilmente il modo più affidabile per esportare un risultato della query in un file CSV (ovvero, offrendoti il ​​massimo controllo).

  1. Copia la query.
  2. In Esplora oggetti fare clic con il tasto destro del mouse sul database in questione.
  3. Seleziona "Attività" >> "Esporta dati ..."
  4. Configura l'origine dati e fai clic su "Avanti".
  5. Scegli "File flat" o "Microsoft Excel" come destinazione.
  6. Specificare un percorso del file.
  7. Se si lavora con un file flat, configurare come desiderato. Se si lavora con Microsoft Excel, selezionare "Excel 2007" (le versioni precedenti hanno un limite di riga a 64k)
  8. Seleziona "Scrivi una query per specificare i dati da trasferire"
  9. Incolla la query dal passaggio 1.
  10. Fare clic su successivo >> rivedere le mappature >> fare clic su successivo >> selezionare "Esegui immediatamente" >> fare clic su "Fine" due volte.

Dopo aver completato questo processo in modo esauriente, ho trovato quanto segue l'opzione migliore

Script di 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

Esegui PowerShell come amministratore

& "c:\path_to_your_ps1_file.ps1"

1
in caso di timeout, aggiungi querytimeout , ad es.Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

6

MS Excel -> Dati -> Nuova query -> Dal database .. seguire i passaggi


6

Sulla base della risposta di NS, ho uno script PowerShell che esporta in un file CSV con le virgolette attorno al campo e separati da virgola e salta le informazioni dell'intestazione nel file.

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"

Le prime due righe consentono di usare il comando invoke-SqlCmd .


6

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 sono un paio di avvertenze:

  1. È necessario disporre del provider Microsoft.ACE.OLEDB.12.0 disponibile. Anche il provider Jet 4.0 funzionerà, ma è antico, quindi ho usato questo.

  2. Il file .CSV dovrà esistere già. Se stai usando le intestazioni ( HDR=YES), assicurati che la prima riga del file .CSV sia un elenco delimitato di tutti i campi.


3

L'uso della tecnica nativa di SQL Server Management Studio per esportare in CSV (come suggerito da @ 8kb) non funziona se i valori contengono virgole, poiché SSMS non racchiude i valori tra virgolette doppie. Un modo più affidabile che ha funzionato per me è semplicemente copiare i risultati (fare clic all'interno della griglia e quindi CTRL-A, CTRL-C) e incollarlo in Excel. Quindi salva come file CSV da Excel.


2

È possibile utilizzare QueryToDoc ( http://www.querytodoc.com ). Ti consente di scrivere una query su un database SQL ed esportare i risultati - dopo aver scelto il delimitatore - in Excel, Word, HTML o CSV


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

come @Slogmeister Extraordinaire citato è corretto.

È necessario avere 1> File già presente con le colonne 2> È necessario avere Office installato

Errori affrontati

1

Messaggio 7303, livello 16, stato 1, riga 1 Impossibile inizializzare l'oggetto origine dati del provider OLE DB "Microsoft.ACE.OLEDB.12.0" per il server collegato "(null)". "

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

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

2

Messaggio 15281, livello 16, stato 1, riga 1 SQL Server ha bloccato l'accesso a STATEMENT 'OpenRowset / OpenDatasource' del componente 'Ad Hoc Distributed Queries' perché questo componente è disattivato come parte della configurazione di sicurezza per questo server. Un amministratore di sistema può abilitare l'uso di "Query distribuite ad hoc" utilizzando sp_configure. Per ulteriori informazioni sull'abilitazione di "Query distribuite ad hoc", cercare "Query distribuite ad hoc" nella documentazione online di SQL Server.

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 0
RECONFIGURE
GO

2

Se non vuoi usare Powershell, questa risposta è una variazione della risposta eccezionale di 8kb. L'unica differenza è che invece di selezionare CSV come formato di output, selezionare Delimitato da tabulazione. In questo modo se ci sono virgole nei tuoi dati, non salterà le celle in Excel. Inoltre, se il delimitatore predefinito di Excel è impostato su schede, puoi semplicemente fare una copia di tutti i risultati della query SSMS (CTRL-A, CTRL-C) e incollare in Excel (non è necessario salvare come file e importare in Excel ):

  • In SSMS, vai su Strumenti> Opzioni> Risultati della query> SQL Server> Risultati nel testo
  • Cambia il formato di output all'estrema destra in Delimitato da tabulazioni
  • Clicca OK

Ora puoi eseguire la tua query, quindi fare un CTRL-A per selezionare tutti i risultati, quindi CTRL-C per copiare negli appunti, quindi passare a Excel 2013 (potrebbe funzionare anche nel 2007, non sono sicuro) e incollare - assumendo il valore predefinito di Excel delimitatore è impostato su tab.

Immagine della schermata Opzioni query SSMS


-1

Sì, tutti questi sono possibili quando si ha accesso diretto ai server. Ma cosa succede se si ha accesso al server solo da un web / application server? Bene, la situazione era questa con noi da molto tempo e la soluzione era l' esportazione di SQL Server in CSV .


Link ... Accesso negato?
hoggar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.