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.
sql-server
csv
ssms
Peter Recore
źródło
źródło
Odpowiedzi:
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:
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:
źródło
Save Results As..
tego samego zestawu wyników przed / po zmianie zachowania nie ma znaczenia dla wyeksportowanego pliku CSV.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.
źródło
'"' + REPLACE(CAST(column AS VARCHAR), '"', '""') + '"'
. W ten sposób nie martwię się o podcięcie pola.NVARCHAR
Jeśli pierwotnym typem byłNVARCHAR
.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
źródło
To smutne, że ta opcja jest zagmatwana, ale nie działa idealnie. Co najmniej działa.
text qualifier
podwójny cudzysłówPowinieneś być gotowy do drogi!
źródło
quotename
. Na szczęście nie pojawił się jednak podwójny cudzysłów. I sugerowałem opcję natywną, zamiast polegać na rozwiązaniach zewnętrznych.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.
źródło
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.
źródło
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.
źródło
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.
źródło
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!
źródło
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
źródło
Od 2016 r. Jest to domyślne zachowanie, gdy wybrana jest następująca opcja w opcjach zapytania:
Kolumny są rozdzielane przecinkami, a pola zawierające przecinki są hermetyzowane w cudzysłowie.
źródło
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 .
Żadnej tajemnicy. Nie ma potrzeby ponownego uruchamiania. Po prostu działa.
źródło