Як отримати вихідні дані у "реальному" форматі CSV у SQL Server Management Studio?


80

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

Усі приклади, які я бачу, обмежуються форматом wannabe. Я не можу зрозуміти, де варіант цитування рядків.

Якщо SSMS справді не здатна здійснити цей основний подвиг, чи існують інші інструменти, які це легко зробити? Я не хочу писати програму на C # щоразу, коли мені потрібен дамп даних.


1
Оскільки це мене так дратувало, я написав власну програму, яка використовує відповідний CSV-автор: github.com/deeja/SQLtoCSV/releases
Ден,

3
Як це ще не виправлено ...
Рей Міясака,

Відповіді:


124

У SSMS 2012 для цього є опція, в Інструменти -> Параметри -> Результати запитів -> SQL Server -> Результати до сітки, це називається "Рядки цитування, що містять роздільники списку під час збереження результатів .csv". Я не знаю, як давно існує такий варіант, але мене бентежать дві речі:

  1. Як це не ввімкнено за замовчуванням
  2. Як це, це варіант, а не невід’ємна частина коду експорту CSV

Це просто кидає виклик переконанню, що поведінка за замовчуванням полягає в тому, щоб експортувати CSV, який неможливо правильно імпортувати. Я помітив, що Excel робить те саме, мені доведеться піти перевірити, чи є у нього теж варіант.

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

ОНОВЛЕННЯ

Знімок екрана нижче:введіть тут опис зображення


4
Існує також у SSMS 2008.
Ллойд

21
Примітка : SSMS кваліфікує поле, що містить роздільник або кваліфікатор, але не кваліфікує поле, що містить розриви рядків. Тож у цьому відношенні СУБД створює технічно недійсні файли CSV
KyleMit

41
Для всіх, хто мав таку ж проблему, як і у мене: вам потрібно відкрити нове вікно редактора запитів, щоб зміни набрали чинності. Виконання Save Results As..одного і того ж набору результатів до / після зміни поведінки не має значення для експортованого CSV.
Jason Larke

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.
НМ

Влучне зауваження. varchar => nvarchar розширюється, не порушить ситуації, але nvarchar => varchar може втратити дані. Краще всього зробити , це використовувати будь-який відповідає оригіналу колонки, але так як люди , як правило, просто копіювати / вставити приклад коду від переповнення стека, код в моїй обороні, ймовірно , краще використовувати NVARCHAR (і це зміна тепер робиться).
Джоел Коухорн,

Оскільки Microsoft не може зробити щось настільки базове, як експорт у файл CSV, це найкраще рішення. Мої файли з розривами рядків були неправильно експортовані за допомогою найбільш голосованого рішення.
невес

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 результатів» - ЗБІЙ; НЕ ВИКОРИСТОВУВАТИ!

Параметри запиту> Результати> інші не позначені

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

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

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

Параметри запиту> Результати> Текст> "Максимальна кількість символів, що відображаються в кожному стовпці" - встановлено максимальну довжину, щоб рядки не усікалися.

Запит> Результати до файлу (це перемикання між усіма 3 параметрами)

Виконати запит (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 ().
Brett Donald

4

Як ви ставитесь до експорту до CSV із SSMS через PowerShell ? У цій публікації описано, як визначити зовнішній інструмент у SSMS, який надсилає поточний вибраний запит до сценарію PowerShell, який експортується до CSV.


Поки що це виглядає як найкращий вибух для мого долара. Я навіть не додав його до меню Зовнішні інструменти в SSMS - я просто запускаю його з командного рядка.
Peter Recore

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. Чудово!
Ладіслав Галлей,

0

Я думаю, що найпростіше відкрити Excel та імпортувати дані із з'єднання SQL, а не за допомогою експорту SSMS .... Я використовую SSMS 2016, і він не має опції "Цитати рядків, що містять роздільники списку під час збереження результатів .csv" імовірно тому, що це не працює

Рон


0

Станом на 2016 рік, це поведінка за замовчуванням, коли в параметрах запиту вибрано такий параметр:

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

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


0

Я хотів би запропонувати альтернативний підхід. У мене це питання закладено в SO. Проголосував у багатьох відповідях та коментарях. Але завжди буває безлад, коли мені потрібно виконати банальне завдання експорту файлу CSV із запиту в SQL Management Studio.

Найпростішим рішенням є просто використовувати інший інструмент, безкоштовний Dbeaver .

  1. Завантажте інструмент мультиплатформенної бази даних Dbeaver (існує портативна версія, яку ви можете використовувати, якщо на вашому комп'ютері немає прав адміністратора).
  2. Запустіть його та створіть нове з'єднання SQL Server.
  3. Відкрийте нову вкладку "Sql editor"
  4. Клацніть стрілку, щоб виконати ваш запит
  5. Клацніть правою кнопкою миші сітку результатів, виберіть "експортувати дані" та виберіть CSV
  6. Вуаля! Тепер у вас є пристойно сформований файл CSV.

Ніякої загадки. Не потрібно перезапускати. Це просто працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.