Я могу довольно легко вывести данные в текстовый файл, такой как:
sqlcmd -S myServer -d myDB -E -Q "select col1, col2, col3 from SomeTable"
-o "MyData.txt"
Тем не менее, я посмотрел на файлы справки для, SQLCMD
но не видел вариант специально для CSV.
Есть ли способ выгрузить данные из таблицы в текстовый файл CSV, используя SQLCMD
?
sql-server
file
csv
sqlcmd
луч
источник
источник
Ответы:
Вы можете запустить что-то вроде этого:
-h-1
удаляет заголовки имен столбцов из результата-s","
устанавливает разделитель столбцов на-w 700
устанавливает ширину строки в 700 символов (она должна быть такой же ширины, как самая длинная строка, иначе она будет перенесена на следующую строку)источник
'""' + col1 + '""' AS col1
, заключив в двойные кавычки или просто вызвав хранимую процедуру.С PowerShell вы можете аккуратно решить эту проблему, отправив Invoke-Sqlcmd в Export-Csv.
SQL Server 2016 включает в себя модуль SqlServer , который содержит
Invoke-Sqlcmd
командлет, который у вас будет, даже если вы просто установите SSMS 2016. До этого SQL Server 2012 включал старый модуль SQLPS , который изменял текущий каталог на тот момент,SQLSERVER:\
когда модуль был впервые используется (среди прочих ошибок), поэтому для этого вам нужно изменить#Requires
строку выше:Чтобы адаптировать пример для SQL Server 2008 и 2008 R2, полностью удалите
#Requires
строку и используйте утилиту sqlps.exe вместо стандартного хоста PowerShell.Invoke-Sqlcmd является PowerShell-эквивалентом sqlcmd.exe. Вместо текста он выводит объекты System.Data.DataRow .
-Query
Параметр работает как-Q
параметр sqlcmd.exe. Передайте ему запрос SQL, который описывает данные, которые вы хотите экспортировать.-Database
Параметр работает как-d
параметр sqlcmd.exe. Передайте ему имя базы данных, которая содержит данные для экспорта.-Server
Параметр работает как-S
параметр sqlcmd.exe. Передайте ему имя сервера, который содержит данные для экспорта.Export-CSV - это командлет PowerShell, который сериализует общие объекты в CSV. Поставляется с PowerShell.
-NoTypeInformation
Параметр подавляет дополнительный выход , который не является частью формата CSV. По умолчанию командлет записывает заголовок с информацией о типе. Он позволяет вам узнать тип объекта при последующей десериализацииImport-Csv
, но это сбивает с толку инструменты, которые ожидают стандартного CSV.-Path
Параметр работает как-o
параметр sqlcmd.exe. Полный путь к этому значению наиболее безопасен, если вы застряли, используя старый модуль SQLPS .-Encoding
Параметр работает как-f
и-u
параметры sqlcmd.exe. По умолчанию Export-Csv выводит только символы ASCII и заменяет все остальные знаками вопроса. Вместо этого используйте UTF8, чтобы сохранить все символы и оставаться совместимым с большинством других инструментов.Основное преимущество этого решения перед sqlcmd.exe или bcp.exe заключается в том, что вам не нужно взламывать команду для вывода действительного CSV. Командлет Export-Csv обрабатывает все это за вас.
Основным недостатком является то, что
Invoke-Sqlcmd
читает весь набор результатов, прежде чем передать его по конвейеру. Убедитесь, что у вас достаточно памяти для всего набора результатов, который вы хотите экспортировать.Это может не работать гладко для миллиардов строк. Если это проблема, вы можете попробовать другие инструменты, или свернуть свой собственный эффективный вариант
Invoke-Sqlcmd
использования System.Data.SqlClient.SqlDataReader класса.источник
Последняя строка содержит специфичные для CSV опции.
-W
удалить завершающие пробелы из каждого отдельного поля-s","
устанавливает разделитель столбцов на запятую (,)-w 999
устанавливает ширину строки в 999 символовОтвет Скотта очень близок к тому, что я использую, но я считаю, что
-W
это действительно хорошее дополнение: мне не нужно обрезать пробел, когда я использую CSV в другом месте.Также см. Ссылку MSDN sqlcmd . Это ставит
/?
вывод опциона в стыд.источник
'""' + col1 + '""' AS col1
, обернув (удвоив) двойные кавычки или просто вызвав хранимую процедуру.Разве это не
bcp
было предназначено?Запустите это из командной строки, чтобы проверить синтаксис.
Например:
Обратите внимание, что
bcp
нельзя выводить заголовки столбцов.Смотрите: bcp Страница служебных документов.
Пример из приведенной выше страницы:
источник
bcp
не включает заголовок (имена столбцов), но он примерно в 10 раз быстрееsqlcmd
(по моему опыту). Для действительно больших данных вы можете использовать ихbcp
для получения данных и использоватьsqlcmd
(выберите top 0 * from ...), чтобы получить заголовок, а затем объединить их.Примечание для тех, кто хочет сделать это, но также имеет заголовки столбцов, вот решение, в котором я использовал пакетный файл:
Это выводит исходные результаты (включая разделители ----, ---- между заголовками и данными) во временный файл, а затем удаляет эту строку, отфильтровывая ее через findstr. Обратите внимание, что он не идеален, поскольку отфильтровывает
-,-
- он не будет работать, если в выводе есть только один столбец, а также отфильтровывает допустимые строки, содержащие эту строку.источник
Этот ответ основан на решении @ iain-elder, которое хорошо работает, за исключением случая с большой базой данных (как указано в его решении). Вся таблица должна уместиться в памяти вашей системы, и для меня это не вариант. Я подозреваю, что лучшее решение будет использовать System.Data.SqlClient.SqlDataReader и пользовательский сериализатор CSV ( см. Пример здесь ), или другой язык с драйвером MS SQL и сериализацией CSV. В духе первоначального вопроса, который, вероятно, искал решения без зависимости, приведенный ниже код PowerShell работал для меня. Это очень медленно и неэффективно, особенно в создании экземпляра массива $ data и вызове Export-Csv в режиме добавления для каждой строки $ chunk_size.
источник
Альтернативный вариант с BCP:
источник
Обычно
sqlcmd
поставляется сbcp
утилитой (как частьmssql-tools
), которая по умолчанию экспортируется в CSV.Использование:
Например:
Чтобы выгрузить все таблицы в соответствующие файлы CSV, вот скрипт Bash :
источник
Ответ выше почти решил это для меня, но это не правильно создает проанализированный CSV.
Вот моя версия:
Кто-то говорит, что
sqlcmd
устарел в пользу какой-то альтернативы PowerShell, забывает, чтоsqlcmd
это не только для Windows. Я использую Linux (а в Windows я все равно избегаю PS).Сказав все это, я считаю,
bcp
легче.источник
Поскольку по двум причинам вы должны запустить мое решение в CMD:
Имя пользователя и пароль для входа иногда необходимы для запроса удаленного экземпляра SQL Server
источник
Вы можете сделать это хакерским способом. Осторожно, используя
sqlcmd
взломать. Если данные имеют двойные кавычки или запятые, у вас возникнут проблемы.Вы можете использовать простой скрипт, чтобы сделать это правильно:
Источник: Запись вывода SQL в CSV с VBScript .
источник
sqlcmd
, мы просто констатируем факт , чтоsqlcmd
не правильно вытекающую запятой, таким образом , будучи едва использовать для любого серьезного выхода CSV.