У меня есть запрос, который я выполняю в SQL Server Management Studio (подключаюсь к базе данных SQL Server 2005). Я хочу экспортировать данные в формате CSV. Не подражательный формат CSV, где вы просто вставляете запятую между столбцами, а «настоящий» формат CSV, в котором вы помещаете кавычки в свои строки. Таким образом вы можете экспортировать данные, содержащие запятые или кавычки.
Все примеры, которые я вижу, ограничиваются форматом подражания. Я не могу понять, где можно заключить строки в кавычки.
Если SSMS действительно неспособен к этому элементарному подвигу, есть ли другие инструменты, которые сделают это легко? Я не хочу писать программу на C # каждый раз, когда мне нужен дамп данных.
sql-server
csv
ssms
Питер Рекор
источник
источник
Ответы:
В SSMS 2012 есть опция для этого в Инструменты -> Параметры -> Результаты запроса -> SQL Server -> Результаты в сетку, это называется «Строки цитаты, содержащие разделители списков при сохранении результатов .csv». Я не знаю, как долго существует такая возможность, но меня сбивают с толку две вещи:
Это просто бросает вызов убеждению, что поведение по умолчанию - экспорт CSV, который невозможно правильно импортировать. Я заметил, что Excel делает то же самое, мне нужно пойти посмотреть, есть ли у этого вариант.
Между тем, спасибо моему коллеге, который указал мне на эту причудливую функциональность, когда я разглагольствовал о том, что экспортер CSV был совершенно бесполезным, и это была лучшая ссылка, которую я нашел об этом, поэтому я подумал, что поставлю знания здесь на благо будущих искателей.
ОБНОВИТЬ
Скриншот ниже:
источник
Save Results As..
одного и того же набора результатов до / после изменения поведения не влияет на экспортированный CSV.Мой обычный обходной путь - встроить его в запрос:
SELECT '"' + REPLACE(CAST(column AS NVARCHAR(4000)), '"', '""') + '"' AS Header, ... FROM ...
Вы можете встроить это в пользовательскую функцию, чтобы сделать ее немного проще, но вам придется создать отдельную функцию для каждого типа данных.
источник
'"' + REPLACE(CAST(column AS VARCHAR), '"', '""') + '"'
. Таким образом, я не беспокоюсь о подрезании поля.NVARCHAR
если исходный тип былNVARCHAR
.Различные комбинации этих настроек могут привести к получению неверных или неполных данных. Это связано с тем, что 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)
Запрашивать имя файла отчета
Откройте файл, чтобы посмотреть результаты
источник
Печально, что опция доступна в запутанном состоянии, но не работает полностью. По крайней мере, работает следующее.
text qualifier
двойными кавычками.вам должно быть хорошо!
источник
quotename
. К счастью, двойные кавычки не попали. И я предлагал собственный вариант вместо того, чтобы зависеть от внешних решений.Как вы относитесь к экспорту в CSV из SSMS через PowerShell ? В этом сообщении описывается, как определить внешний инструмент в SSMS, который отправляет текущий выбранный запрос в сценарий PowerShell, который экспортирует в CSV.
источник
Я не знаю, как сделать это только с помощью SSMS. Я знаю, что у TOAD (http://www.toadworld.com/) есть опция CSV. Не уверен, что это экранированный формат. Если SSIS является вариантом, вы можете преобразовать его в формат, который избегает строк (истинный CSV), но этого нет в SSMS.
Если вам нужно написать программу на C #, я бы подумал о том, чтобы запросить таблицу, а затем запустить запрос, поскольку метаданные укажут, что нужно для выхода.
источник
Обычно я использую такую функцию:
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 -> Результаты в сетку и увеличить Максимальное количество извлекаемых символов, если вам это нужно.
источник
Возможно, это не сработает для вашего приложения, но я обычно обхожу эту проблему путем экспорта в формат с разделителями табуляции. Не упускайте из виду это простое решение, если оно подходит вам.
источник
Поскольку все упомянутые выше настройки не исправили CSV, сгенерированный моим SSMS (SQL Server 2014), и экспорт файла с разделителями табуляции не улучшил его, мы с коллегой создали сценарий конвертера (Ruby) для преобразования SSMS CSV в читаемый CSV. Он сохраняет кодировку, разделители и разрывы строк исходного файла и даже выполняет проверку точного соответствия байта в конце (он создает файл в формате SSMS из проанализированного (!) Входного файла и сравнивает оба файла).
https://gist.github.com/gr8bit/62202ea89a7e3aff67df2ff080ee8e88
Свяжитесь со мной на github, если у вас возникнут ошибки, пожалуйста. Ура!
источник
Я думаю, что проще всего открыть Excel и импортировать данные из SQL-соединения, а не использовать экспорт SSMS .... Я использую SSMS 2016, и у него нет опции «Цитировать строки, содержащие разделители списков при сохранении результатов .csv». предположительно потому, что это не работает
Рон
источник
С 2016 года это поведение по умолчанию, когда в параметрах запроса выбран следующий параметр:
Столбцы разделяются запятыми, а поля, содержащие запятые, заключаются в двойные кавычки.
источник
Хочу предложить альтернативный подход. У меня есть этот вопрос в закладке SO. Проголосовал за множество ответов и комментариев. Но когда мне нужно выполнить банальную задачу по экспорту CSV-файла из запроса в SQL Management Studio, это всегда беспорядок.
Самое простое решение - просто использовать другой инструмент, бесплатный Dbeaver .
Никакой загадки. Нет необходимости перезагружать. Просто работает.
источник