Экспорт результата запроса в файл .csv в SQL Server 2008


147

Как я могу экспортировать результат запроса в файл .csv в SQL Server 2008?



Вам нужно экранировать ваш разделитель? Большинство ответов до сих пор предполагают, что вы этого не делаете, что на самом деле не совсем CSV.
Ник

@Nick - обычно разделители содержатся только в строке, и они обычно заключаются в кавычки. См. Мой ответ, чтобы увидеть решение этой проблемы. stackoverflow.com/questions/6115054/…
MacGyver


Иногда использую Python
LV98,

Ответы:


173
  1. Откройте SQL Server Management Studio
  2. Перейдите в Инструменты> Параметры> Результаты запроса> SQL Server> Результаты в текст.
  3. Справа есть раскрывающийся список под названием Формат вывода.
  4. Выберите с разделителями-запятыми и нажмите ОК.

Вот полноэкранная версия этого изображения ниже

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

Это покажет результаты вашего запроса в виде текста, разделенного запятыми.

Чтобы сохранить результаты запроса в файл: Ctrl + Shift + F


11
Ответ немного вводит в заблуждение ... Когда вы нажимаете Ctrl+Shift+F, он меняет только режим вывода, это не влияет на результаты, если вы уже выполнили запрос. Чтобы это отразилось, вам необходимо повторно запустить запрос. Когда вы запустите его в режиме «Результаты в файл», он предложит вам указать, где вы хотите сохранить результаты.
qJake

3
Должно быть: «Инструменты»> «Параметры»> «Результаты запроса»> « SQL Server» > «Результаты в текст»
congusbongus

46
Мне было недостаточно повторного выполнения запроса. Мне пришлось закрыть окно запроса, открыть новое, а затем снова запустить запрос.
Breandán

3
Подтвержденный комментарий @ Breandán. Новые настройки не будут применяться к открытому в данный момент окну запроса, необходимо закрыть их и повторно запустить запрос.
Shinigamae

4
Единственное, что мне нужно было сделать, так это экспортировать его как расширение RPT по умолчанию. После этого вы можете просто переименовать его в CSV, и он заработает.
Thomas Bennett

140

Я знаю, что это немного устарело, но вот способ намного проще ...

  1. Запустите свой запрос с настройками по умолчанию (результаты помещаются в формате сетки, если ваш запрос не в формате сетки, см. Ниже)

  2. Щелкните правой кнопкой мыши результаты сетки, выберите «Сохранить результаты как» и сохраните их.

Если ваши результаты не в формате сетки, щелкните правой кнопкой мыши в том месте, где вы пишете запрос, наведите указатель мыши на «Результаты в» и нажмите «Результаты в сетку».

Имейте в виду, что вы НЕ записываете заголовки столбцов!

Удачи!


1
Единственная проблема в том, что этот метод, похоже, не позволяет вам устанавливать какие-либо параметры. Например, все значения NULL отображаются в выходных файлах как «NULL» и т. Д. Возможно, есть способ установить это значение, о котором я не знаю.
Ной

14
Удивительно, но даже в SSMS 2012 это неправильно цитирует текст для CSV. Запятая или новая строка в CHAR / VARCHAR должны быть заключены в кавычки, но это не так. Это приводит к смещению данных в новые столбцы или в новую строку.
Эрик Дж.

4
Также не дает вам заголовков столбцов.
Дон

8
@Don это дает заголовки столбцов, если вы зайдете в «Запрос» -> «Параметры запроса ...», вкладку сетки и установите флажок «включать заголовки столбцов при копировании или сохранении результатов»
Роб Уайз

7
Это должен быть ответ.
pspahn

48

Вы можете использовать PowerShell

$AttachmentPath = "CV File location"
$QueryFmt= "Query"

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $QueryFmt | Export-CSV $AttachmentPath

Спасибо! Это было единственное предложение, которое сработало для меня. Правильно
справляется с побегом

3
+10, если бы мог. Ответьте только на то, чтобы убежать. Чтобы заставить это работать, мне пришлось добавить две строки в верхней части скрипта: Add-PSSnapin SqlServerCmdletSnapin100и Add-PSSnapin SqlServerProviderSnapin100.
Эрик Дж.

если вы столкнулись с таймаутом, добавьте тайм-аут запроса, напримерInvoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Тило

1
Как новичку Powershell мне нужно было установить модуль SqlServer: Install-Module -Name SqlServer(но не нужно было подключать эти командлеты). Кроме того , я спас команду в сценарий, который не будет работать , пока я не изменил политику выполнения: Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser.
Sandyscott

@sandyscott Я тоже новичок в Powershell, так что спасибо. В любом случае, я думаю, что в этом случае RemoteSignedбудет достаточно политики исполнения.
BigBother

14

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

  1. Скопируйте запрос.
  2. В обозревателе объектов щелкните правой кнопкой мыши нужную базу данных.
  3. Выберите «Задачи» >> «Экспорт данных ...»
  4. Настройте свой источник данных и нажмите «Далее».
  5. В качестве места назначения выберите «Плоский файл» или «Microsoft Excel».
  6. Укажите путь к файлу.
  7. Если вы работаете с плоским файлом, настройте его по желанию. Если вы работаете с Microsoft Excel, выберите «Excel 2007» (предыдущие версии имеют ограничение на количество строк в 64 КБ)
  8. Выберите «Написать запрос, чтобы указать данные для передачи».
  9. Вставьте запрос с шага 1.
  10. Нажмите «Далее» >> просмотреть сопоставления >> нажмите «Далее» >> выберите «запустить немедленно» >> дважды нажмите «завершить».

После тщательного изучения этого процесса я обнаружил, что следующее является лучшим вариантом

Сценарий PowerShell

$dbname = "**YOUR_DB_NAME_WITHOUT_STARS**"
$AttachmentPath = "c:\\export.csv"
$QueryFmt= @"
**YOUR_QUERY_WITHOUT_STARS**
"@

Invoke-Sqlcmd   -ServerInstance **SERVER_NAME_WITHOUT_STARS** -Database  $dbname -Query $QueryFmt | Export-CSV $AttachmentPath -NoTypeInformation

Запустите PowerShell от имени администратора

& "c:\path_to_your_ps1_file.ps1"

1
если вы столкнулись с тайм-аутом, добавьте тайм-аут запроса, например,Invoke-Sqlcmd -ServerInstance MySQLserver123 -Query $QueryFmt -querytimeout 600 | Export-CSV $AttachmentPath
Тило

6

MS Excel -> Данные -> Новый запрос -> Из базы данных .. выполните следующие действия.


6

Основываясь на ответе NS, у меня есть сценарий PowerShell, который экспортирует в файл CSV с кавычками вокруг поля и разделенными запятыми, и он пропускает информацию заголовка в файле.

add-pssnapin sqlserverprovidersnapin100
add-pssnapin sqlservercmdletsnapin100

$qry = @"
Select
  *
From
 tablename
"@

Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $qry | convertto-CSV -notype | select -skip 1  > "full path and filename.csv"

Первые две строки позволяют использовать Invoke-SqlCmd command-let.


6

Используйте T-SQL :

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

Но есть несколько предостережений:

  1. У вас должен быть доступен поставщик Microsoft.ACE.OLEDB.12.0. Провайдер Jet 4.0 тоже подойдет, но он старый, поэтому я использовал его.

  2. Файл .CSV должен уже существовать. Если вы используете headers ( HDR=YES), убедитесь, что первая строка файла .CSV представляет собой список всех полей с разделителями.


3

Использование собственной техники SQL Server Management Studio для экспорта в CSV (как предлагается @ 8kb) не работает, если ваши значения содержат запятые, потому что SSMS не заключает значения в двойные кавычки. Более надежный способ, который сработал для меня, - просто скопировать результаты (щелкните внутри сетки, а затем CTRL-A, CTRL-C) и вставьте их в Excel. Затем сохраните как файл CSV из Excel.


2

Вы можете использовать QueryToDoc ( http://www.querytodoc.com ). Он позволяет вам написать запрос к базе данных SQL и экспортировать результаты - после выбора разделителя - в Excel, Word, HTML или CSV.


2
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=D:\;HDR=YES;FMT=Delimited','SELECT * FROM [FileName.csv]')
SELECT Field1, Field2, Field3 FROM DatabaseName

поскольку @Slogmeister Extraordinaire Quoted верен.

Необходимо, чтобы 1> Файл уже присутствовал со столбцами 2> Необходимо установить Office

Ошибки, с которыми столкнулись

1

Msg 7303, уровень 16, состояние 1, строка 1 Не удается инициализировать объект источника данных поставщика OLE DB «Microsoft.ACE.OLEDB.12.0» для связанного сервера «(null)».

64 бит версия http://download.microsoft.com/download/2/4/3/24375141-E08D-4803-AB0E-10F2E3A07AAA/AccessDatabaseEngine_x64.exe

32 бит версия http://download.microsoft.com/download/f/d/8/fd8c20d8-e38a-48b6-8691-542403b91da1/AccessDatabaseEngine.exe

2

Msg 15281, уровень 16, состояние 1, строка 1 SQL Server заблокировал доступ к ЗАЯВЛЕНИЮ «OpenRowset / OpenDatasource» компонента «Специальные распределенные запросы», поскольку этот компонент отключен как часть конфигурации безопасности для этого сервера. Системный администратор может включить использование «Ad Hoc Distributed Queries» с помощью процедуры sp_configure. Для получения дополнительной информации о включении «Ad Hoc Distributed Queries» найдите «Ad Hoc Distributed Queries» в электронной документации по SQL Server.

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 0
RECONFIGURE
GO

2

Если вы не хотите использовать Powershell, этот ответ представляет собой вариант отличного ответа 8 КБ. Единственное отличие состоит в том, что вместо выбора CSV в качестве формата вывода выберите с разделителями табуляции. Таким образом, если в ваших данных есть запятые, ячейки в Excel не будут пропущены. Кроме того, если у вас установлен разделитель Excel по умолчанию на вкладки, вы можете просто скопировать все результаты запроса SSMS (CTRL-A, CTRL-C) и вставить в Excel (нет необходимости сохранять как файл и импортировать в Excel. ):

  • В SSMS перейдите в Инструменты> Параметры> Результаты запроса> SQL Server> Результаты в текст
  • Измените выходной формат справа на разделитель табуляцией
  • Нажмите ОК

Теперь вы можете выполнить свой запрос, затем нажать CTRL-A, чтобы выбрать все результаты, затем CTRL-C, чтобы скопировать в буфер обмена, затем переключиться на Excel 2013 (может работать и в 2007 году, не уверен) и вставить - при условии, что Excel по умолчанию разделитель установлен на табуляцию.

Изображение экрана параметров запроса SSMS


1

Здесь стоит упомянуть еще один метод:

SQLCMD -S SEVERNAME -E -Q "SELECT COLUMN FROM TABLE" -s "," -o "c:\test.csv"

ПРИМЕЧАНИЕ: я не вижу, чтобы какой-либо сетевой администратор разрешил вам запускать сценарии PowerShell.


1
К вашему сведению, этот ответ уже обсуждается более подробно в ссылке «возможный дубликат» на stackoverflow.com/questions/425379/…
mtone

0

Надеюсь, 10 лет не слишком поздно, я использовал это в планировщике Windows;

"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE"
-S BLRREPSRVR\SQLEXPRESS -d Reporting_DB -o "C:\Reports\CHP_Gen.csv" -Q "EXEC dbo.CHP_Generation_Report" -W -w 999 -s ","

Он открывает команду sql .exe и запускает сценарий, разработанный для команды sql. Командный сценарий sql очень прост в использовании, выполнив несколько поисков в Google, проб и ошибок. Вы можете видеть, что он выбирает базу данных, определяет местоположение вывода и выполняет процедуру. Процедура - это просто запрос, выбирающий, какие строки и столбцы отображать из таблицы в базе данных.


-1

Да, все это возможно, когда у вас есть прямой доступ к серверам. Но что, если у вас есть доступ к серверу только с веб-сервера / сервера приложений? Что ж, ситуация была такая у нас давно, и решением было экспорт SQL Server в CSV .


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