Wyeksportuj wynik zapytania do pliku .csv w programie SQL Server 2008


141

Jak wyeksportować wynik zapytania do pliku .csv w programie SQL Server 2008?



Czy chcesz, aby Twój separator uciekł? Większość dotychczasowych odpowiedzi zakłada, że ​​nie, co tak naprawdę nie jest tym samym plikiem CSV.
Nick

@Nick - zazwyczaj ograniczniki są zawarte tylko w ciągu znaków i zwykle są otoczone cudzysłowami. Zobacz moją odpowiedź, aby zobaczyć rozwiązanie tego problemu. stackoverflow.com/questions/6115054/…
MacGyver


Czasami używam Pythona
LV98

Odpowiedzi:


168
  1. Otwórz program SQL Server Management Studio
  2. Przejdź do Narzędzia> Opcje> Wyniki zapytania> SQL Server> Wyniki do tekstu
  3. Po prawej stronie znajduje się rozwijane okno o nazwie Format wyjściowy
  4. Wybierz opcję Rozdzielany przecinkami i kliknij OK

Poniżej znajduje się pełnoekranowa wersja tego obrazu

wprowadź opis obrazu tutaj

Spowoduje to wyświetlenie wyników zapytania w postaci tekstu rozdzielanego przecinkami.

Aby zapisać wyniki zapytania do pliku: Ctrl + Shift + F


10
Odpowiedź jest trochę myląca ... Kiedy naciśniesz Ctrl+Shift+F, zmienia tylko tryb wyjścia, nie ma wpływu na wyniki, jeśli już wykonałeś zapytanie. Aby zostało to odzwierciedlone, musisz ponownie uruchomić zapytanie. Po uruchomieniu go w trybie „Wyniki do pliku” powinien wyświetlić monit o określenie, gdzie chcesz zapisać wyniki.
qJake,

3
Powinien być Idź do Narzędzia> Opcje> Wyniki zapytania> SQL Server > Wyniki do tekstu
congusbongus

45
Ponowne uruchomienie zapytania nie było dla mnie wystarczające. Musiałem zamknąć okno zapytania, otworzyć nowe, a następnie ponownie uruchomić zapytanie.
Breandán,

3
Potwierdzony komentarz @ Breandán. Nowe ustawienia nie będą miały zastosowania do aktualnie otwartego okna zapytania, należy je zamknąć i ponownie uruchomić zapytanie.
Shinigamae

3
Musiałem tylko wyeksportować go jako domyślne rozszerzenie RPT. Po wykonaniu tej czynności możesz po prostu zmienić jego nazwę na CSV i działa.
Thomas Bennett

140

Wiem, że to trochę stare, ale tutaj jest znacznie łatwiejszy sposób ...

  1. Uruchom zapytanie z ustawieniami domyślnymi (umieszcza wyniki w formacie siatki, jeśli twój nie jest w formacie siatki, patrz poniżej)

  2. Kliknij prawym przyciskiem myszy wyniki siatki, kliknij „Zapisz wyniki jako” i zapisz.

Jeśli wyniki nie są w formacie siatki, kliknij prawym przyciskiem myszy w miejscu wpisywania zapytania, najedź kursorem na „Wyniki do” i kliknij „Wyniki do siatki”

Pamiętaj, że NIE przechwytujesz nagłówków kolumn!

Powodzenia!


1
Jedynym problemem jest to, że ta metoda nie pozwala ustawić żadnych opcji. Na przykład wszystkie wartości NULL są wyświetlane w plikach wyjściowych jako „NULL”, itd. Być może istnieje sposób na ustawienie tego, o którym jednak nie wiem.
Noah

13
O dziwo, nawet w SSMS 2012 nie cytuje poprawnie tekstu dla CSV. Przecinek lub nowy wiersz w znaku CHAR / VARCHAR powinien być cytowany, ale tak nie jest. To powoduje, że dane są przenoszone do nowych kolumn lub do nowego wiersza.
Eric J.

4
Nie daje też nagłówków kolumn.
Don

8
@Don this daje nagłówki kolumn, jeśli przejdziesz do „Query” -> „Query Options ...”, zakładki grid i zaznacz „include column headers when copy or save results”
Rob Wise

7
To powinna być odpowiedź.
pspahn

46

Możesz użyć programu PowerShell

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

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

Dziękuję Ci! To była jedyna sugestia, która zadziałała dla mnie. Uchwyty uciekają prawidłowo
emertechie

3
+10, gdybym mógł. Tylko odpowiedź, która obsługuje ucieczkę. Aby to zadziałało, musiałem dodać dwa wiersze na górze skryptu: Add-PSSnapin SqlServerCmdletSnapin100i Add-PSSnapin SqlServerProviderSnapin100.
Eric J.

jeśli napotkasz limit czasu, dodaj querytimeout, więc np.Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

1
Jako nowicjusz Powershell musiałem zainstalować moduł SqlServer: Install-Module -Name SqlServer(ale nie musiałem korzystać z tych poleceń cmdlet). Również ja zapisane polecenia w skrypcie, co nie byłoby aż bym zmienił politykę wykonanie: Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser.
Sandyscott

@sandyscott Też jestem nowicjuszem w Powershell, więc dziękuję. W każdym razie myślę, że w tym przypadku RemoteSignedwystarczy polityka wykonania.
BigBother

14

Jeśli dana baza danych jest lokalna, prawdopodobnie najpewniejszy sposób wyeksportowania wyniku zapytania do pliku CSV (to znaczy zapewniający największą kontrolę) jest prawdopodobnie najbardziej niezawodnym sposobem .

  1. Skopiuj zapytanie.
  2. W Object Explorer kliknij prawym przyciskiem myszy odpowiednią bazę danych.
  3. Wybierz „Zadania” >> „Eksportuj dane ...”
  4. Skonfiguruj źródło danych i kliknij „Dalej”.
  5. Jako miejsce docelowe wybierz „Plik płaski” lub „Microsoft Excel”.
  6. Określ ścieżkę do pliku.
  7. Jeśli pracujesz z prostym plikiem, skonfiguruj według potrzeb. Jeśli pracujesz z Microsoft Excel, wybierz „Excel 2007” (poprzednie wersje mają limit wierszy na 64 KB)
  8. Wybierz „Napisz zapytanie, aby określić dane do przesłania”
  9. Wklej zapytanie z kroku 1.
  10. Kliknij dalej >> przejrzyj mapowania >> kliknij dalej >> wybierz "uruchom natychmiast" >> kliknij dwukrotnie "zakończ".

Po wyczerpującym przejściu przez ten proces uznałem, że najlepszą opcją jest następująca opcja

Skrypt programu 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

Uruchom PowerShell jako administrator

& "c:\path_to_your_ps1_file.ps1"

1
jeśli napotkasz limit czasu, dodaj querytimeout, więc np.Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Tilo

6

MS Excel -> Dane -> Nowe zapytanie -> Z bazy danych .. postępuj zgodnie z instrukcjami


6

Opierając się na odpowiedzi NS, mam skrypt PowerShell, który eksportuje do pliku CSV z cudzysłowami wokół pola i oddzielonymi przecinkami i pomija informacje nagłówka w pliku.

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"

Pierwsze dwa wiersze umożliwiają użycie polecenia let-polecenia Invoke-SqlCmd .


6

Użyj 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

Ale jest kilka zastrzeżeń:

  1. Musisz mieć dostępnego dostawcę Microsoft.ACE.OLEDB.12.0. Dostawca Jet 4.0 też będzie działał, ale jest stary, więc zamiast tego użyłem tego.

  2. Plik CSV będzie musiał już istnieć. Jeśli używasz nagłówków ( HDR=YES), upewnij się, że pierwsza linia pliku .CSV to rozdzielana lista wszystkich pól.


3

Używanie natywnej techniki SQL Server Management Studio do eksportowania do CSV (zgodnie z sugestią @ 8kb) nie działa, jeśli wartości zawierają przecinki, ponieważ SSMS nie zawija wartości w podwójne cudzysłowy. Bardziej niezawodnym sposobem, który zadziałał w moim przypadku, jest po prostu skopiowanie wyników (kliknij wewnątrz siatki, a następnie CTRL-A, CTRL-C) i wklejenie ich do programu Excel. Następnie zapisz jako plik CSV z programu Excel.


2

Możesz użyć QueryToDoc ( http://www.querytodoc.com ). Pozwala napisać zapytanie w bazie danych SQL i wyeksportować wyniki - po wybraniu separatora - do programu Excel, Word, HTML lub 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

jako @Slogmeister Extraordinaire Quoted jest poprawne.

Trzeba mieć 1> Plik już obecny z kolumnami 2> Trzeba mieć zainstalowany Office

Napotkano błędy

1

Msg 7303, poziom 16, stan 1, wiersz 1 Nie można zainicjować obiektu źródła danych dostawcy OLE DB „Microsoft.ACE.OLEDB.12.0” dla serwera połączonego „(null)”.

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

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

2

Msg 15281, poziom 16, stan 1, wiersz 1 SQL Server zablokował dostęp do STATEMENT „OpenRowset / OpenDatasource” składnika „Ad Hoc Distributed Queries”, ponieważ ten składnik jest wyłączony w ramach konfiguracji zabezpieczeń tego serwera. Administrator systemu może włączyć korzystanie z „kwerend rozproszonych ad hoc” przy użyciu sp_configure. Aby uzyskać więcej informacji na temat włączania „Zapytań rozproszonych ad hoc”, wyszukaj hasło „Zapytania rozproszone ad hoc” w SQL Server Books Online.

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

2

Jeśli nie chcesz używać Powershell, ta odpowiedź jest odmianą świetnej odpowiedzi 8kb. Jedyna różnica polega na tym, że zamiast wybierać CSV jako format wyjściowy, wybierz opcję Rozdzielany tabulatorami. W ten sposób, jeśli w danych są przecinki, nie pominie komórek w programie Excel. Ponadto, jeśli masz domyślny separator programu Excel ustawiony na karty, możesz po prostu skopiować wszystkie wyniki zapytania SSMS (CTRL-A, CTRL-C) i wkleić do programu Excel (nie ma potrzeby zapisywania jako pliku i importowania do programu Excel ):

  • W SSMS przejdź do Narzędzia> Opcje> Wyniki zapytania> SQL Server> Wyniki na tekst
  • Zmień format wyjściowy po prawej stronie na rozdzielany tabulatorami
  • Kliknij OK

Teraz możesz wykonać zapytanie, a następnie wykonać CTRL-A, aby zaznaczyć wszystkie wyniki, następnie CTRL-C, aby skopiować do schowka, a następnie przełączyć się na Excel 2013 (może działać również w 2007 roku, nie jestem pewien) i wkleić - zakładając domyślne ustawienie Excela separator jest ustawiony na tabulator.

Obraz ekranu opcji zapytań SSMS


-1

Tak, wszystko to jest możliwe, gdy masz bezpośredni dostęp do serwerów. Ale co, jeśli masz dostęp do serwera tylko z serwera WWW / aplikacji? Cóż, sytuacja była taka z nami dawno temu, a rozwiązaniem był eksport SQL Server do CSV .


Link ... Odmowa dostępu?
hoggar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.