Как получить выходные данные экспорта в «реальном» формате CSV в SQL Server Management Studio? - PullRequest
64 голосов
/ 24 мая 2011

У меня есть запрос, который я выполняю в SQL Server Management Studio (подключение к базе данных SQL Server 2005).Я хочу экспортировать данные в формате CSV.Не в формате CSV, где вы просто вставляете запятую между каждым столбцом, а в «реальном» формате CSV, где вы помещаете кавычки вокруг строк.Таким образом, вы можете экспортировать данные с запятыми или кавычками.

Все примеры, которые я вижу, ограничиваются форматом подражателей.Я не могу понять, где находится опция цитирования строк.

Если SSMS действительно неспособна на это основное умение, есть ли другие инструменты, которые легко это сделают?Я не хочу писать программу на C # каждый раз, когда мне нужен дамп данных.

Ответы [ 10 ]

111 голосов
/ 28 октября 2013

В SSMS 2012 есть опция для этого, в меню Сервис -> Параметры -> Результаты запроса -> SQL Server -> Результаты в таблицу, она называется «Цитировать строки, содержащие разделители списков, при сохранении результатов .csv». Я не знаю, как долго существует такая опция, но я сбит с толку двумя вещами:

  1. Почему это не включено по умолчанию
  2. Почему это опция, а не внутренняя часть кода экспорта CSV

Это просто противоречит убеждению, что поведение по умолчанию - экспорт CSV, который невозможно импортировать должным образом. Я заметил, что Excel делает то же самое, мне нужно посмотреть, есть ли у него опция.

В то же время, благодаря моему коллеге, который указал мне на эту причудливую функциональность, когда я разглагольствовал о том, что экспортер CSV был совершенно бесполезен, и это была лучшая ссылка, которую я нашел об этом, поэтому я подумал, что положил бы здесь знания в пользу будущих искателей.

UPDATE

Снимок экрана ниже: enter image description here

10 голосов
/ 24 мая 2011

Мой обычный обходной путь - встроить его в запрос:

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

Вы можете встроить его в пользовательскую функцию, чтобы сделать ее немного проще, но вам нужно создать отдельныйфункция для каждого типа данных.

7 голосов
/ 18 сентября 2015

Различные комбинации этих настроек могут привести к получению неправильных или частичных данных.Это потому, что Microsoft не думала, что это достаточно важно, чтобы исправить эти проблемы.Я только объясняю, что происходит с файлами CSV при отправке результатов в файл.

Чтобы получить хорошие результаты, выполните следующие действия:

Откройте новое окно запроса (новая вкладка / сеанс) ... в противном случае конфигурация ниже будет потеряна иустановите значения по умолчанию

Напишите запрос для обработки кавычки внутри кавычки, а также оберните все строковые типы данных в кавычки.Также имейте в виду, что разные грамматики СУБД и языка программирования принимают разный синтаксис для экранированной двойной кавычки (если этот вывод используется в качестве входных данных для другой системы).Некоторые используют \".Некоторые используют "".XML использует &quot ;.Вероятно, причина, по которой Microsoft решила игнорировать эту функцию, поэтому им не приходилось иметь дело с аргументами.

.. Если Escape-последовательность новой системы "".

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

.. Если Escape-последовательность новой системы равна \".

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

Конфигурация:

Параметры запроса> Результаты> «Включить заголовки столбцов при копировании или сохранениирезультаты "флажок

Параметры запроса> Результаты>" Цитировать строки, содержащие разделители списков, при сохранении результатов .csv "- BROKEN;НЕ ИСПОЛЬЗУЙТЕ!

Параметры запроса> Результаты> другие не проверены

Параметры запроса> Результаты> Текст> Разделенные запятой (настройка в правом верхнем углу)

Параметры запроса> Результаты> Текст> «Включить заголовки столбцов в набор результатов» отмечен

Параметры запроса> Результаты> Текст> Другие не проверены

Параметры запроса> Результаты> Текст> «Максимальное количество символов, отображаемых вдля каждого столбца "- задайте максимальную длину, чтобы строки не усекались.

Запрос> Результаты в файл (это переключение между всеми 3 параметрами)

Выполнение запроса (F5)

Запрос имени файла отчета

Открыть файл для просмотра результатов

ПРИМЕЧАНИЕ. Если вам нужно делать это регулярно, лучше просторазработка программы, которая сделает это для вас на .NET или Java, или на любом другом языке, который вам удобен.В противном случае у вас есть высокая вероятность ошибиться.Затем внимательно изучите синтаксис системы, в которую вы импортируете, прежде чем определять экспорт из SQL Server.

4 голосов
/ 25 мая 2011

Как вы относитесь к Экспорту в CSV из SSMS через PowerShell ?В этой статье описывается, как определить внешний инструмент в SSMS, который отправляет текущий выбранный запрос в сценарий PowerShell, который экспортирует в CSV.

3 голосов
/ 20 февраля 2017

Печально, что опция доступна в запутанном состоянии, но не совсем в рабочем состоянии. Следующее работает как минимум.

  1. Выберите «Задачи> Экспорт данных» из контекстного меню БД (также не работает на уровне таблицы)
  2. В качестве источника выберите «Поставщик Microsoft OLE DB для SQL Server»
  3. Для пункта назначения выберите «Плоский файл ...» и укажите «Формат» как разделитель, а text qualifier как двойную кавычку
  4. Выбрать таблицу или запрос (я работал с запросом)
  5. Завершить работу мастера

тебе должно быть хорошо идти!

1 голос
/ 22 октября 2017

Поскольку все вышеупомянутые настройки не исправили CSV, сгенерированный моей SSMS (SQL Server 2014), и экспорт файла, разделенного табуляцией, не улучшил ситуацию, мы с коллегой создали скрипт конвертера (Ruby) дляпреобразовать SSV CSV в читаемый CSV.Он сохраняет кодировку, разделители и разрывы строк исходного файла и даже выполняет проверку на точное совпадение байтов в конце (он создает файл в формате SSMS из проанализированного (!) Входного файла и сравнивает оба файла).

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

Свяжитесь со мной на github, если у вас возникнут ошибки, пожалуйста.Ура! * * 1006

1 голос
/ 26 января 2017

Возможно, это не сработает для вашего приложения, но я обычно решаю эту проблему, экспортируя в формат с разделителями табуляции.Не забывайте об этом простом решении, если оно применимо к вам.

1 голос
/ 23 апреля 2015

Обычно я использую такую ​​функцию:

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

)
RETURNS varchar(max)
AS
BEGIN

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

END

И в выбранном я помещаю это здесь:

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

А в SMSS 2012 просто щелкните правой кнопкой мыши на сетке и сохраните результатыили скопируйте всю сетку (ctrl-A) и ctrl-V в Excel.

Самый простой способ управлять данными, например, в MS Excel, без проблем со столбцами.

Конечно, вы должнынажмите «Цитировать строки, содержащие разделители списков, при сохранении результатов .csv» в «Инструменты» -> «Параметры» -> «Результаты запроса» -> «Sql Server» -> «Результаты в таблицу» и увеличьте максимальное количество символов, получаемых при необходимости.

1 голос
/ 24 мая 2011

Я не знаю, как это сделать, используя только SSMS.Я знаю, что TOAD (http://www.toadworld.com/) имеет опцию CSV. Не уверен, что это экранированный формат. Если SSIS является опцией, вы можете конвертировать в формат, который экранирует строки (истинный CSV), но его нет в SSMS.

Если вам нужно написать программу на C #, я бы подумал о том, чтобы запросить таблицу и затем выполнить запрос, так как метаданные подскажут, что нужно экранировать.

0 голосов
/ 29 марта 2018

Я думаю, что проще всего открыть Excel и импортировать данные из SQL-соединения, а не использовать экспорт SSMS .... Я использую SSMS 2016, и у него нет опции «Цитировать строки, содержащие разделители списков при сохранении результатов .csv», предположительно, потому что она не работает

Рон

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...