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.