Jak uzyskać dane wyjściowe eksportu w „prawdziwym” formacie CSV w SQL Server Management Studio?


80

Mam zapytanie, które uruchamiam w programie SQL Server Management Studio (łącząc się z bazą danych SQL Server 2005). Chcę wyeksportować dane w formacie CSV. Nie chciałby być formatem CSV, w którym po prostu wstawiasz przecinek między każdą kolumną, ale „prawdziwym” formatem CSV, w którym umieszczasz cudzysłowy wokół ciągów. W ten sposób możesz wyeksportować dane zawierające przecinki lub cudzysłowy.

Wszystkie przykłady, które widzę, ograniczają się do formatu „wannabe”. Nie mogę dowiedzieć się, gdzie jest opcja cytowania ciągów.

Jeśli SSMS naprawdę nie jest w stanie wykonać tego podstawowego zadania, czy są inne narzędzia, które zrobią to z łatwością? Nie chcę pisać programu w języku C # za każdym razem, gdy potrzebuję zrzutu danych.


1
Ponieważ bardzo mnie to denerwowało, napisałem własny program, który używa odpowiedniego narzędzia do zapisywania
Dan

3
Jak, u licha, nie zostało to jeszcze naprawione ...
Rei Miyasaka,

Odpowiedzi:


124

W SSMS 2012 jest do tego opcja, w Narzędzia -> Opcje -> Wyniki zapytania -> SQL Server -> Wyniki do siatki, nazywa się to „Cytuj ciągi zawierające separatory listy podczas zapisywania wyników .csv”. Nie wiem, od jak dawna istnieje taka opcja, ale zdumiewają mnie dwie rzeczy:

  1. Dlaczego nie jest włączony domyślnie
  2. Dlaczego jest to opcja, a nie nieodłączna część kodu eksportującego CSV

Po prostu zaprzecza przekonaniu, że domyślnym zachowaniem jest eksport CSV, którego nie można poprawnie zaimportować. Zauważyłem, że Excel robi to samo, muszę sprawdzić, czy to też jest opcja.

W międzyczasie, dzięki mojemu koledze, który wskazał mi tę dziwną funkcjonalność, kiedy narzekałem na to, że eksporter CSV jest całkowicie bezużyteczny, a to był najlepszy link, jaki znalazłem, więc pomyślałem, że umieściłem wiedza tutaj z korzyścią dla przyszłych poszukiwaczy.

AKTUALIZACJA

Zrzut ekranu poniżej:wprowadź opis obrazu tutaj


4
Istnieje również w SSMS 2008.
Lloyd,

21
Uwaga : SSMS zakwalifikuje pole zawierające separator lub kwalifikator, ale nie zakwalifikuje pola zawierającego podziały wierszy. W związku z tym SSMS tworzy technicznie nieprawidłowe pliki CSV
KyleMit

41
Dla każdego, kto miał ten sam problem, co ja: Aby zmiany odniosły skutek, należy otworzyć nowe okno edytora zapytań. Wykonanie Save Results As..tego samego zestawu wyników przed / po zmianie zachowania nie ma znaczenia dla wyeksportowanego pliku CSV.
Jason Larke

7
W SSMS v17 stwierdziłem, że brakuje określonej opcji, jednak wydaje się, że została ona scalona z inną opcją „Uwzględnij nagłówki kolumn podczas kopiowania lub zapisywania wyników”, ponieważ sprawdzenie tego przyniosło pożądany efekt. Otwarcie nowego okna zapytania jest nadal wymagane, aby ustawienie zaczęło obowiązywać.
Dziewięć ogonów

9
Microsoft: „Uczyńmy CSV domyślnym formatem eksportu dla SSMS”. Także Microsoft: „Zignorujmy podstawowe szczegóły implementacji”.
Owen

12

Moim normalnym rozwiązaniem jest wbudowanie go w zapytanie:

SELECT '"' + REPLACE(CAST(column AS NVARCHAR(4000)), '"', '""') + '"' AS Header, ... FROM ...

Możesz to wbudować w funkcję zdefiniowaną przez użytkownika, aby trochę to ułatwić, ale musisz zbudować oddzielną funkcję dla każdego typu danych.


2
Może nie być konieczne, ale po prostu jest mi łatwiej '"' + REPLACE(CAST(column AS VARCHAR), '"', '""') + '"'. W ten sposób nie martwię się o podcięcie pola.
Rob

1
Dziś używam varchar (max). Kiedy pisałem to pierwotnie, właśnie pochodziłem ze sklepu, który nadal działał na (ugh) Sql Server 2000 i dopiero zaczynał patrzeć na rok 2005.
Joel Coehoorn

Może być również konieczne zachowanie typu kolumny, np. NVARCHARJeśli pierwotnym typem był NVARCHAR.
NM

Słuszna uwaga. varchar => nvarchar się rozszerza, nie zepsuje rzeczy, ale nvarchar => varchar może utracić dane. Najlepszym rozwiązaniem jest zastosowanie co odpowiada pierwotnej kolumny, ale ponieważ ludzie mają tendencję do tylko kopiuj / wklej przykładowy kod off przepełnienia stosu, kod w moją odpowiedź jest chyba lepiej za korzystanie nvarchar (i ta zmiana jest teraz).
Joel Coehoorn

Ponieważ Microsoft nie może zrobić czegoś tak podstawowego, jak eksport do pliku csv, jest to najlepsze rozwiązanie. Moje pliki z podziałem wiersza nie zostały poprawnie wyeksportowane przy użyciu najczęściej wybieranego rozwiązania.
neves

8

Różne kombinacje tych ustawień mogą dawać wyniki w postaci niepoprawnych lub częściowych danych. Dzieje się tak, ponieważ firma Microsoft uważała, że ​​rozwiązanie tych problemów nie jest wystarczająco ważne. Wyjaśniam tylko, co dzieje się z plikami CSV podczas wysyłania wyników do pliku.

Aby uzyskać dobre wyniki, wykonaj następujące czynności:

Otwórz nowe okno zapytania (nowa karta / sesja) ... jeśli tego nie zrobisz, poniższa konfiguracja zostanie utracona i zostanie przywrócona wartość domyślna

Napisz zapytanie, aby obsłużyć cytat w cytacie, a także zawiń wszystkie typy danych w cudzysłów. Należy również pamiętać, że różne gramatyki DBMS i języków programowania akceptują inną składnię podwójnego cudzysłowu ze zmianą znaczenia (jeśli używasz tego wyjścia jako danych wejściowych dla innego systemu). Niektórzy używają \". Niektórzy używają "". Zastosowania XML " Prawdopodobnie był to powód, dla którego Microsoft zdecydował się zignorować tę funkcję, więc nie musieli zajmować się argumentami.

.. Jeśli sekwencja ucieczki nowego systemu to "".

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '""') + '"' FROM table1

.. Jeśli sekwencja ucieczki nowego systemu to \".

SELECT '"' + REPLACE(CAST(column1 AS VARCHAR(MAX)), '"', '\"') + '"' FROM table1

Konfiguracja:

Opcje zapytania> Wyniki> „Uwzględnij nagłówki kolumn podczas kopiowania lub zapisywania wyników” zaznaczone

Opcje zapytania> Wyniki> "Cytuj ciągi zawierające separatory list przy zapisywaniu wyników .csv" - BROKEN; NIE UŻYWAĆ!

Opcje zapytania> Wyniki> inne niezaznaczone

Opcje zapytania> Wyniki> Tekst> rozdzielany przecinkami (ustawienie w prawym górnym rogu)

Opcje zapytania> Wyniki> Tekst> „Uwzględnij nagłówki kolumn w zestawie wyników” zaznaczone

Opcje zapytania> Wyniki> Tekst> inne niezaznaczone

Opcje zapytania> Wyniki> Tekst> „Maksymalna liczba znaków wyświetlanych w każdej kolumnie” - ustaw maksymalną długość, aby ciągi nie były obcinane.

Zapytanie> Wyniki do pliku (jest to przełączanie między wszystkimi 3 opcjami)

Wykonaj zapytanie (F5)

Pytaj o nazwę pliku raportu

Otwórz plik, aby zobaczyć wyniki

UWAGA: Jeśli musisz to robić regularnie, lepiej po prostu opracuj program, który zrobi to za Ciebie w .NET lub Javie, lub w jakimkolwiek innym języku, który Ci odpowiada. W przeciwnym razie istnieje duże prawdopodobieństwo popełnienia błędu. Następnie bądź bardzo świadomy składni systemu, do którego importujesz, zanim zdefiniujesz eksport z SQL Server.


7

To smutne, że ta opcja jest zagmatwana, ale nie działa idealnie. Co najmniej działa.

  1. Wybierz „Zadania> Eksportuj dane” z menu kontekstowego bazy danych (nie działa również na poziomie tabeli)
  2. Jako źródło wybierz „Dostawca Microsoft OLE DB dla programu SQL Server”
  3. Jako miejsce docelowe wybierz „Plik płaski…” i określ „Format” jako rozdzielany i text qualifierpodwójny cudzysłów
  4. Wybierz tabelę lub zapytanie (pracowałem z zapytaniem)
  5. Zakończ kreatora

Powinieneś być gotowy do drogi!


5
Można by pomyśleć, że to zadziała, ale nie - kolumny zawierające w danych cudzysłowy nie są odpowiednio chronione. Faux-csv to wszystko, co oferuje SQL Server w kreatorze eksportu.
mattmc3

Ja ani mój konsument nie mieliśmy powodów do reklamacji, w których dane były przecinkiem i pojedynczymi cudzysłowami w polach tekstowych. Jak już wspomniałem, pracowałem z opcją zapytania i jeśli wiesz o brudnych polach, zawsze możesz je opakować quotename. Na szczęście nie pojawił się jednak podwójny cudzysłów. I sugerowałem opcję natywną, zamiast polegać na rozwiązaniach zewnętrznych.
user1017815

Ta opcja jest nadal najbardziej praktyczna, mimo że nie powoduje automatycznego unikania podwójnych cudzysłowów. Łatwo jest uniknąć podwójnych cudzysłowów za pomocą funkcji replace ().
Brett Donald

4

Co sądzisz o eksportowaniu do CSV z SSMS przez PowerShell ? W tym poście opisano, jak zdefiniować narzędzie zewnętrzne w programie SSMS, które wysyła aktualnie wybrane zapytanie do skryptu programu PowerShell, który eksportuje do pliku CSV.


Jak dotąd wygląda to na najlepszy zwrot z każdej zainwestowanej złotówki. Nie dodałem go nawet do menu Narzędzia zewnętrzne w SSMS - po prostu uruchamiam go z wiersza poleceń.
Peter Recore

1

Nie wiem, jak to zrobić z samym SSMS. Wiem, że TOAD (http://www.toadworld.com/) ma opcję CSV. Nie jestem pewien, czy jest to format ze znakami ucieczki. Jeśli opcja SSIS jest opcją, można przekonwertować ją na format, który ucieka z ciągów (prawdziwy CSV), ale nie ma tego w SSMS.

Jeśli musisz napisać program C #, rozważyłbym wykonanie zapytania w tabeli, a następnie uruchomienie zapytania, ponieważ metadane wskażą, które wymagają ucieczki.


1

Zwykle używam tego rodzaju funkcji:

CREATE FUNCTION [dbo].[toExport]
(
    @txt varchar(max)

)
RETURNS varchar(max)
AS
BEGIN

    return REPLACE(REPLACE(REPLACE(@txt, ';', ','), CHAR(10), ' '), CHAR(13), ' ');

END

W zaznaczeniu umieściłem to tutaj:

SELECT dbo.toExport( column_name ) AS column_name FROM ....

W SMSS 2012 wystarczy kliknąć prawym przyciskiem myszy siatkę i zapisać wyniki jako lub skopiować całą siatkę (ctrl-A) i ctrl-V do programu Excel.

To najłatwiejszy sposób na zarządzanie danymi np. W MS Excel bez problemów z kolumnami.

Oczywiście musisz kliknąć „Cytuj ciągi zawierające separatory listy podczas zapisywania wyników .csv” w Narzędzia -> Opcje -> Wyniki zapytania -> Serwer Sql -> Wyniki do siatki i zwiększ maksymalną liczbę pobieranych znaków, jeśli tego potrzebujesz.


1

Może to nie zadziała w przypadku Twojej aplikacji, ale zwykle omijam ten problem, eksportując do formatu rozdzielanego tabulatorami. Nie zapomnij o tym prostym rozwiązaniu, jeśli dotyczy Ciebie.


1

Ponieważ wszystkie wspomniane powyżej ustawienia nie naprawiły pliku CSV wygenerowanego przez mój SSMS (SQL Server 2014), a eksportowanie pliku rozdzielanego tabulatorami nie poprawiło go, mój kolega i ja stworzyliśmy skrypt konwertera (Ruby), aby przekonwertować SSMS CSV do czytelnego CSV. Zachowuje kodowanie, separatory i podziały wierszy oryginalnego pliku, a nawet sprawdza na końcu dokładne dopasowanie bajtów (tworzy plik w formacie SSMS z przeanalizowanego (!) Pliku wejściowego i porównuje oba pliki).

https://gist.github.com/gr8bit/62202ea89a7e3aff67df2ff080ee8e88

Skontaktuj się ze mną na github, jeśli napotkasz błędy, proszę. Twoje zdrowie!


Muszę to przetestować, ale wydaje się, że to jest dokładnie to, czego potrzebujemy i jest już w Rubim. Świetny!
Ladislav Gallay

0

Myślę, że najłatwiej jest otworzyć program Excel i zaimportować dane z połączenia SQL, zamiast używać eksportu SSMS ... Używam SSMS 2016 i nie ma opcji „Cytuj ciągi zawierające separatory listy podczas zapisywania wyników .csv” prawdopodobnie dlatego, że nie działa

Ron


0

Od 2016 r. Jest to domyślne zachowanie, gdy wybrana jest następująca opcja w opcjach zapytania:

wprowadź opis obrazu tutaj

Kolumny są rozdzielane przecinkami, a pola zawierające przecinki są hermetyzowane w cudzysłowie.


0

Chciałbym zasugerować alternatywne podejście. Mam to pytanie dodane do zakładek w SO. Zagłosowano na wiele odpowiedzi i komentarzy. Ale zawsze jest bałagan, gdy muszę wykonać banalne zadanie wyeksportowania pliku CSV z zapytania w SQL Management Studio.

Najłatwiejszym rozwiązaniem jest użycie innego narzędzia, darmowego Dbeavera .

  1. Pobierz wieloplatformowe narzędzie bazy danych Dbeaver (dostępna jest wersja przenośna, z której możesz korzystać, jeśli nie masz uprawnień administratora na swoim komputerze).
  2. Uruchom go i utwórz nowe połączenie z serwerem SQL.
  3. Otwórz nową kartę „Edytor Sql”
  4. Kliknij strzałkę, aby wykonać zapytanie
  5. Kliknij prawym przyciskiem myszy siatkę wyników, wybierz „Eksportuj dane” i wybierz CSV
  6. Voilá! Teraz masz przyzwoicie sformatowany plik CSV.

Żadnej tajemnicy. Nie ma potrzeby ponownego uruchamiania. Po prostu działa.

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.