Как получить экспортный результат в «реальном» формате CSV в SQL Server Management Studio?


80

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

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

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


1
Поскольку это меня так сильно раздражало, я написал свою собственную программу, в которой используется подходящий модуль записи CSV: github.com/deeja/SQLtoCSV/releases
Дэн

Ответы:


124

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

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

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

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

ОБНОВИТЬ

Скриншот ниже:введите описание изображения здесь


4
Также существует в SSMS 2008.
Ллойд

21
Примечание . SSMS квалифицирует поле, содержащее разделитель или квалификатор, но не квалифицирует поле, содержащее разрывы строк. В связи с этим SSMS создает технически недействительные файлы CSV
KyleMit 06

41
Для всех, у кого была такая же проблема, как и у меня: вам нужно открыть новое окно редактора запросов, чтобы изменения вступили в силу. Выполнение Save Results As..одного и того же набора результатов до / после изменения поведения не влияет на экспортированный CSV.
Джейсон Ларк

7
В SSMS v17 я обнаружил, что указанный параметр отсутствует, однако, похоже, он был объединен с другим параметром «Включить заголовки столбцов при копировании или сохранении результатов», потому что проверка, которая имела для меня желаемый эффект. Чтобы настройки вступили в силу, по-прежнему необходимо открыть новое окно запроса.
Nine Tails

9
Microsoft: «Давайте сделаем CSV форматом экспорта по умолчанию для SSMS». Также Microsoft: «Давайте проигнорируем основные детали реализации».
Оуэн

12

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

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

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


2
Возможно, это не обязательно, но мне легче просто '"' + REPLACE(CAST(column AS VARCHAR), '"', '""') + '"'. Таким образом, я не беспокоюсь о подрезании поля.
Роб

1
Сегодня я использую varchar (max). Когда я писал это изначально, я только что пришел из магазина, который все еще был на (тьфу) Sql Server 2000 и только начинал смотреть на 2005 год.
Джоэл Кохорн

Вам также может потребоваться сохранить тип столбца, например, NVARCHARесли исходный тип был NVARCHAR.
NM

Хорошая точка зрения. varchar => nvarchar расширяется, ничего не сломает, но nvarchar => varchar может потерять данные. Лучше всего сделать , это использовать любой соответствует оригиналу колонки, но так как люди , как правило, просто копировать / вставить пример кода от переполнения стека, код в моем ответе, вероятно , лучше использовать NVARCHAR (и это изменение теперь делается).
Joel Coehoorn

Поскольку Microsoft не может делать что-то столь же простое, как экспорт в файл csv, это лучшее решение. Мои файлы с разрывами строк не были правильно экспортированы с использованием решения, получившего наибольшее количество голосов.
neves

8

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

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

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

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

.. Если Escape Sequence новой системы есть "".

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

.. Если Escape Sequence новой системы есть \".

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

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

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

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

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

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

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

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

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

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

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

Запрашивать имя файла отчета

Откройте файл, чтобы посмотреть результаты

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


7

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

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

вам должно быть хорошо!


5
Вы можете подумать, что это сработает, но нет - столбцы, содержащие двойные кавычки в данных, не экранированы должным образом. Faux-csv - это все, чем SQL Server занимается в мастере экспорта.
mattmc3

У меня или моего потребителя не было причин жаловаться на то, что данные содержат запятую и одинарные кавычки в текстовых полях. Как я уже упоминал, я работал с опцией запроса, и если вы знаете о грязных полях, вы всегда можете обернуть их quotename. К счастью, двойные кавычки не попали. И я предлагал собственный вариант вместо того, чтобы зависеть от внешних решений.
user1017815 04

Этот вариант по-прежнему наиболее практичен, хотя он не позволяет автоматически избегать двойных кавычек. Достаточно легко избежать двойных кавычек с помощью replace ().
Бретт Дональд

4

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


Пока это похоже на лучшую отдачу за мои деньги. Я даже не добавил его в меню «Внешние инструменты» в SSMS - я просто запускаю его из командной строки.
Питер Рекор

1

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

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


1

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

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

)
RETURNS varchar(max)
AS
BEGIN

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

END

И в select я поместил это здесь:

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

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

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

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


1

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


1

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

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

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


Мне нужно это проверить, но похоже, это именно то, что нам нужно, и это уже в Ruby. Большой!
Ladislav Gallay

0

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

Рон


0

С 2016 года это поведение по умолчанию, когда в параметрах запроса выбран следующий параметр:

введите описание изображения здесь

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


0

Хочу предложить альтернативный подход. У меня есть этот вопрос в закладке SO. Проголосовал за множество ответов и комментариев. Но когда мне нужно выполнить банальную задачу по экспорту CSV-файла из запроса в SQL Management Studio, это всегда беспорядок.

Самое простое решение - просто использовать другой инструмент, бесплатный Dbeaver .

  1. Загрузите инструмент многоплатформенной базы данных Dbeaver (есть портативная версия, которую можно использовать, если на вашем компьютере нет прав администратора).
  2. Запустите его и создайте новое соединение с SQL Server.
  3. Откройте новую вкладку «Sql-редактор»
  4. Щелкните стрелку, чтобы выполнить запрос
  5. Щелкните правой кнопкой мыши сетку результатов, выберите «экспортировать данные» и выберите CSV.
  6. Вуаля! Теперь у вас есть хорошо отформатированный файл CSV.

Никакой загадки. Нет необходимости перезагружать. Просто работает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.