sql - Экспорт данных из SQL Server Express в CSV (требуется кавычки и экранирование). Sql экспорт в csv


Экспорт данных в CSV файл из Microsoft SQL Server, используя Access 2003 | Info-Comp.ru

Если у Вас возникла необходимость выгружать данные из базы MS SQL Server в текстовый формат CSV, то из данного материала Вы узнаете, как это можно сделать средствами Access 2003.

Итак, если у Вас встала задача выгрузить данные с SQL сервера в CSV файл, то ее можно решить несколькими способами, например:

  • С помощью встроенной консольной утилиты BCP;
  • Используя SSIS - SQL Server Integration Services;
  • Или как вариант можно с помощью конструкции INSERT INTO OPENROWSET;
  • Другие варианты, например с использованием сторонних приложений.

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

Программа BCP тоже не подходит, даже если вызывать ее средствами T-SQL, используя хранимую процедуру, так как для этого потребуется включить возможность выполнения xp_cmdshell, а это не безопасно.

Конструкция INSERT INTO OPENROWSET подразумевает наличие уже созданного CSV файла с нужными заголовками полей, тоже не подходит, так как это неудобно.

Остается только использовать что-то другое, например, Access, и для меня это оказалось лучшим вариантом, так как приложение, в которое мне необходимо было интегрировать возможность экспорта в CSV, как раз реализовано в виде ADP проекта Access 2003.

Сейчас в тестовом варианте я покажу Вам, как можно в ADP проекте Access 2003 реализовать возможность выгрузки результатов запросов в CSV файл.

Исходные данные

В качестве примера я буду использовать СУБД Microsoft SQL Server 2012 Express.

Допустим, у нас будет база данных Test, а в ней следующая таблица

CREATE TABLE dbo.TestTable( Id int IDENTITY(1,1) NOT NULL, ProductName VARCHAR(50) NOT NULL, Price MONEY NULL, CONSTRAINT PK_TestTable PRIMARY KEY CLUSTERED (Id ASC)) GO

Заполним таблицу тестовыми данными

INSERT INTO dbo.TestTable (ProductName, Price) VALUES('Принтер',100) GO INSERT INTO dbo.TestTable (ProductName, Price) VALUES('Сканер',150) GO INSERT INTO dbo.TestTable (ProductName, Price) VALUES('Монитор',200) GO INSERT INTO dbo.TestTable (ProductName, Price) VALUES('Системный блок',300) GO INSERT INTO dbo.TestTable (ProductName, Price) VALUES('Ноутбук',400) GO

Посмотрим, что у нас получилось

SELECT * FROM dbo.TestTable

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

Реализация экспорта данных с SQL сервера в формат CSV в Access 2003

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

Для этого открываем свой ADP проект, он соответственно должен быть подключен к тестовой базе Test (или к той, которая нужна Вам).

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

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

В «Обработку события» нашей кнопки вставляем следующий код VBA (я его подробно прокомментировал):

Private Sub ExportInCSV_Click() On Error GoTo Err 'Обработка ошибок 'Переменные Dim Path As String, NameFile As String, PathNameFile As String Dim PathSave As FileDialog, CountColumn As Integer, StrSql As String Dim Response As Variant, rs As ADODB.Recordset Dim StrLineInFile As String, Delim As String Delim = ";" 'Разделитель StrSql = "SELECT * FROM dbo.TestTable" 'Запрос к базе данных 'Получаем данные Set rs = New ADODB.Recordset rs.open StrSql, CurrentProject.Connection, adOpenDynamic, adLockOptimistic 'Узнаем количество полей CountColumn = rs.Fields.count 'Выбор каталога для выгрузки Set PathSave = Application.FileDialog(msoFileDialogFolderPicker) With PathSave .ButtonName = "Сохранить" .title = "Выбор папки для выгрузки" .InitialFileName = "c:\" .AllowMultiSelect = False End With 'Если выбрали каталог, то начинаем выгружать If PathSave.Show = -1 Then NameFile = "TestFile.csv" 'Имя файла Path = PathSave.SelectedItems(1) 'Путь 'Проверка на последний обратный слеш If InStrRev(Path, "\") <> Len(Path) Then Path = Path & "\" End If 'Итоговый файл PathNameFile = Path & NameFile Response = MsgBox("Данные будут сохранены в " & PathNameFile & vbNewLine & _ "Для подтверждения нажмите [Да]", vbYesNo, "Подтверждение") If Response = vbYes Then Open PathNameFile For Output As #1 'Записываем название полей For i = 0 To CountColumn - 1 If StrLineInFile <> "" Then StrLineInFile = StrLineInFile & Delim & rs.Fields(i).NAME Else StrLineInFile = rs.Fields(i).NAME End If Next Print #1, StrLineInFile 'Объединяем все поля и записываем в файл, каждую строку отдельно While Not (rs.EOF) StrLineInFile = "" For i = 0 To CountColumn - 1 If StrLineInFile <> "" Then StrLineInFile = StrLineInFile & Delim & rs.Fields(i).value Else StrLineInFile = rs.Fields(i).value End If Next Print #1, StrLineInFile rs.MoveNext Wend Set rs = Nothing Close #1 MsgBox "Данные выгружены", vbDefaultButton1, "Результат" End If End If ex: Exit Sub Err: MsgBox Err.Description Resume ex End Sub

Примечание! Для работы FileDialog требуется подключить библиотеку Microsoft Office 11.0 Object Library. Это делается следующим образом: в редакторе Microsoft Visual Basic (где вы вставляете код VBA) откройте меню Tools->References, найдите нужную библиотеку, поставьте галочку и нажмите «ОК».

Сохраняем и запускаем нашу форму, щелкаем по кнопке (в моем случае ExportInCSV), в итоге у нас откроется диалоговое окно выбора пути сохранения файла, мы выбираем каталог для экспорта и жмем «Сохранить». Затем подтверждаем свое действие и жмем «ОК».

После того как выгрузка будет завершена, появится соответствующее сообщение. Для проверки открываем каталог, в который выгрузился файл, находим файл TestFile.csv и открываем его любым блокнотом, например, мне нравится Notepad++.

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

На этом все, удачи!

Похожие статьи:

info-comp.ru

file - Как экспортировать данные в формате CSV из SQL Server с помощью sqlcmd?

С помощью PowerShell вы можете решить проблему аккуратно, используя Invoke-Sqlcmd в Export-Csv.

#Requires -Module SqlServer Invoke-Sqlcmd -Query "SELECT * FROM DimDate;" ` -Database AdventureWorksDW2012 ` -Server localhost | Export-Csv -NoTypeInformation ` -Path "DimDate.csv" ` -Encoding UTF8

SQL Server 2016 включает в себя модуль SqlServer, который содержит командлет Invoke-Sqlcmd, который у вас будет, даже если вы просто установите SSMS 2016. До этого SQL Server 2012 включал старый SQLPS, который изменил бы текущий каталог на SQLSERVER:\, когда модуль был впервые использован (среди других ошибок), поэтому для этого вам нужно изменить строку #Requires выше:

Push-Location $PWD Import-Module -Name SQLPS # dummy query to catch initial surprise directory change Invoke-Sqlcmd -Query "SELECT 1" ` -Database AdventureWorksDW2012 ` -Server localhost |Out-Null Pop-Location # actual Invoke-Sqlcmd |Export-Csv pipeline

Чтобы адаптировать пример для SQL Server 2008 и 2008 R2, полностью удалите строку #Requires и используйте утилиту sqlps.exe вместо стандартный хост PowerShell.

Invoke-Sqlcmd - эквивалент sqlcmd.exe PowerShell. Вместо текста он выводит объекты 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.

qaru.site

Экспорт данных из SQL Server Express в CSV (требуется кавычки и экранирование)

Я потратил 2 дня, пытаясь экспортировать таблицу из 75 000 строк, содержащую большое текстовое поле пользовательских входных данных с установки SQL-сервера. Эти данные содержат каждый простой символ ascii, вкладки и новые строки. Мне нужно экспортировать CSV, где указано каждое поле, а кавычки в цитированных столбцах правильно экранированы ("").

Вот что я пробовал до сих пор: - Щелчок правой кнопкой мыши по базе данных из Management Studio и экспорт в Excel: сбой из-за слишком большого поля. - Экспорт данных из Management Studio в плоский файл с разделителем текста и разделом запятой - абсолютно бесполезен, не избегает кавычек в поле, делающем файл полностью двусмысленным. - BCP из командной строки - также не поддерживает поля цитирования.

Мне нужно импортировать с помощью библиотеки Ruby FasterCSV. Он не позволяет ограничителю цитат быть нестандартным символом ascii или более чем одним символом. Он также не позволяет \ n или \ r в столбцах без кавычек.

Любая помощь приветствуется.

36

2017-09-12 02:49

источник

Ответы:

Это можно сделать! Однако вам нужно специально настроить SSMS для использования цитируемого вывода, потому что по какой-то глупой причине это не значение по умолчанию.

В окне запроса, которое вы хотите сохранить  перейдите в Query -> Параметры запроса ...

Установите флажок «строки цитаты, содержащие разделители списков при сохранении результатов .csv».

тогда

select 'apple,banana,cookie' as col1,1324 as col2,'one two three' as col3,'a,b,"c",d' as col4

выйдет

col1,col2,col3,col4 "apple,banana,cookie",1324,one two three,"a,b,""c"",d"

чего мы все хотим.

43

2018-06-16 13:31

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

  1. Я поднял свой стол в Экспресс, сделав SELECT * заявление
  2. Просто выберите результирующие строки и Ctrl  + С
  3. Открыт Excel
  4. Выделив количество столбцов таблицы, в которую я вставлял,
  5. Вклеился, и он работал!
  6. Теперь просто нужно экспортировать Excel в CSV и сделать.

Я знаю, это, наверное, звучит глупо, но это действительно сработало для меня.

25

2017-12-07 21:09

Самый простой способ сделать это:

Используйте инструменты импорта данных Excel

  • Перейти к данным> Из других источников> С сервера Sql
  • Введите имя сервера и т. Д.
  • Выберите таблицу или представление, которое вы хотите импортировать.

Затем сохраните импортированные данные в файл CSV. Если вы хотите экспортировать запрос, сохраните запрос в виде представления

7

2017-12-10 11:11

Вот суть сценария, который я использую для этого:

require 'rubygems' require 'active_record' require 'tiny_tds' require 'activerecord-sqlserver-adapter' require 'acts_as_reportable' require 'ruport' ActiveRecord::Base.logger = Logger.new("log/debug.log") ActiveRecord::Base.establish_connection( :adapter => 'sqlserver', :mode => 'dblib', :dataserver => 'servername', :username => 'username', :password => 'password', :timeout => '60000' ) class Table1 < ActiveRecord::Base set_table_name 'table_name' set_primary_key 'table_id' acts_as_reportable end Table1.report_table(:all).save_as("finished/table1.csv")

Надеюсь, поможет!

2

2017-12-07 22:12

Мне любопытно, почему никто не предложил использовать SSIS (службы интеграции SQL Server) для этого процесса? Все мастера и инструменты для импорта / экспорта из SSMS (SQL Server Management Studio) абсолютно не предназначены для того, чтобы быть исчерпывающими (и, конечно же, их нет, и да, есть много того, на что Microsoft должна должна отвечать с ограничениями ). Но SSIS - очень полнофункциональный инструмент ETL, предназначенный для решения проблем в точку  как этот. Кривая обучения может быть немного крутой, но экспорт таблицы в файл csv с разделителями / запятыми не является особо сложным.

Возможно, это необходимо для Visual Studio, чтобы создать среду для создания пакета: http://www.microsoft.com/en-us/download/details.aspx?id=42313 (ссылка для VS 2013, другие ссылки доступны для других версий VS).

1

2017-08-07 14:52

Возможно, приведенная ниже ссылка может вам помочь:

Импорт / экспорт данных с помощью SQL Server 2005 Express

0

2017-09-12 03:46

Решение Роберта Калхауна не сработало для меня. У нас было много текста с запятыми и возвратами каретки / новостями и т. Д. Мы использовали функцию «Экспорт» с некоторыми изменениями в решении Криса Христодулу выше.

В SQL Management Studio щелкните правой кнопкой мыши базу данных и выберите «Задачи -> Экспорт данных».

Затем выберите SQL Server как источник и Flat File в качестве адресата. Назовите файл MyFile.csv.

Установите определитель текста как "

Выберите «Написать запрос для указания передачи данных» и вставьте запрос. Вы можете оставить следующие настройки в качестве значений по умолчанию.

С экспортированными данными откройте Excel и сохраните в формате Excel.

0

2017-09-08 10:51

Лучшее решение, которое я мог бы придумать, - это выбрать все строки и сделать копию XML.

Вставьте его в файл блокнота и сохраните его как файл XML. Затем откройте этот XML-файл от excel и voila! По крайней мере, как я получил свой файл.

0

2017-09-07 18:36

Самое простое решение, которое я нашел, заключается в добавлении двойных кавычек в ваш запрос;

SELECT '"'+MYCHARACTERDATA+'"' FROM MYTABLE

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

Daft..SSMS должен экспортировать как надлежащий CSV с цитированными текстовыми полями и правильно экранированные кавычки в этих полях.

0

2018-03-30 11:34

Мы сделали небольшой скрипт для преобразования SSSS «сломанный» CSV в правильный CSV, найти его в этом ответе:

https://stackoverflow.com/a/46876236/1532201

0

2017-10-22 16:06

programmerz.ru

sql - Экспорт данных из SQL Server Express в CSV (требуется кавычки и экранирование)

Это можно сделать! Однако вам нужно специально настроить SSMS для использования цитируемого вывода, потому что по какой-то глупой причине это не значение по умолчанию.

В окне запроса, которое вы хотите сохранить, перейдите в Query -> Query Options ...

Установите флажок «строки цитаты, содержащие разделители списков при сохранении результатов .csv».

тогда

select 'apple,banana,cookie' as col1,1324 as col2,'one two three' as col3,'a,b,"c",d' as col4

выйдет

col1,col2,col3,col4 "apple,banana,cookie",1324,one two three,"a,b,""c"",d"

чего мы все хотим.

Самый простой способ сделать это:

Используйте инструменты импорта данных Excel

  • Перейти к данным> Из других источников> С сервера Sql
  • Введите имя сервера и т. Д.
  • Выберите таблицу или представление, которое вы хотите импортировать.

Затем сохраните импортированные данные в файл CSV. Если вы хотите экспортировать запрос, сохраните запрос в виде представления

Мне любопытно, почему никто не предложил использовать SSIS (службы интеграции SQL Server) для этого процесса? Все мастера и инструменты для импорта / экспорта из SSMS (SQL Server Management Studio) абсолютно не предназначены для того, чтобы быть исчерпывающими (и, конечно же, их нет, и да, есть много того, на что Microsoft должна должна отвечать с ограничениями ). Но SSIS - очень полнофункциональный инструмент ETL, предназначенный для решения таких проблем , как этот. Кривая обучения может быть немного крутой, но экспорт таблицы в файл csv с разделителями / запятыми не является особо сложным.

Может потребоваться это добавить для Visual Studio, чтобы создать среду для создания пакета: http://www.microsoft.com/en-us/download/details.aspx?id=42313 (ссылка для VS 2013, другие ссылки доступны для других версий VS).

Решение Роберта Калхауна не сработало для меня. У нас было много текста с запятыми и возвратами каретки / новыми символами и т. Д. Мы использовали функцию «Экспорт» с некоторыми изменениями в решении Криса Христодулу выше.

В SQL Management Studio щелкните правой кнопкой мыши базу данных и выберите «Задачи -> Экспорт данных».

Затем выберите SQL Server как источник и Flat File в качестве адресата. Назовите файл MyFile.csv.

Установите определитель текста как "

Выберите «Написать запрос для указания передачи данных» и вставьте запрос. Вы можете оставить следующие настройки в качестве значений по умолчанию.

С экспортированными данными откройте Excel и сохраните в формате Excel.

Самое простое решение, которое я нашел, заключается в добавлении двойных кавычек в ваш запрос;

SELECT '"'+MYCHARACTERDATA+'"' FROM MYTABLE

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

Daft..SSMS должен экспортировать как надлежащий CSV с цитированными текстовыми полями и правильно экранированные кавычки в этих полях.

code-examples.net

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

Как экспортировать результат запроса в CSV-файл в SQL Server 2008?

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

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

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

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

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

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

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

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

Удачи!

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

$AttachmentPath = "CV File location" $QueryFmt= "Query" Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $QueryFmt | Export-CSV $AttachmentPath

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

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

использование 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 должен будет уже существовать. Если вы используете заголовки ( HDR=YES), убедитесь, что первая строка файла .CSV представляет собой список с разделителями всех полей.

Building on N.S's answer, I have a PowerShell script that exports to a CSV file with the quote marks around the field and comma separated and it skips the header information in the file.

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"

The first two lines enable the ability to use the Invoke-SqlCmd command-let.

MS Excel -> Data -> New Query -> From Database ..follow the steps

Using the native SQL Server Management Studio technique to export to CSV (as @8kb suggested) doesn't work if your values contain commas, because SSMS doesn't wrap values in double quotes. A more robust way that worked for me is to simply copy the results (click inside the grid and then CTRL-A, CTRL-C) and paste it into Excel. Then save as CSV file from Excel.

programmerz.ru

BCP SQL экспорт в CSV

Im пытается запустить процедуру магазин запрос на экспорт в CSV-файл с помощью BCP в качестве ежедневной задачи на SQL сервере

используя обычный запрос в порядке, например

выберите работы @ CSV = 'BCP "выберите * из таблицы" queryout '+ @ FileAndPath3 +' -c -t, -T -S' + @@ имясервера

Однако, когда я добавляю мой запрос, который представляет собой список данных сделок в диапазон дат, похоже, сбой

@p_companyId uniqueidentifier = '189be460-99d1-42e9-b4ed-8de6f8724ce8', @p_Path varchar(300) = 'C:\temp\',' @p_Date datetime = getutcdate set @[email protected]_Path + CONVERT(nvarchar(30), @p_Date, 112) + '_' + CONVERT(varchar(36), @p_companyId) + '_transactionslog.csv'; declare @csv varchar(8000) declare @csvSQL varchar(8000) set @csvSQL = 'SELECT TOP (100) [KICSDEV].dbo.MOVIEDETAIL.Title , [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.MemberId, [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.CreateDateTime as ''DateTime'' FROM [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG INNER JOIN [KICSDEV].dbo.MOVIEDETAIL ON [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.MovieDetailId = [KICSDEV].dbo.MOVIEDETAIL.MovieDetailId INNER JOIN [KICSDEV].dbo.MEMBER ON [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.MemberId = [KICSDEV].dbo.MEMBER.MemberId INNER JOIN [KICSDEV].dbo.CINEMA ON [KICSDEV].dbo.MEMBER.CinemaId = [KICSDEV].dbo.CINEMA.CinemaId WHERE ([KICSDEV].dbo.CINEMA.CompanyId = '+ @p_companyId + ' and [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.CreateDateTime >= ' + @p_Date +' and [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.CreateDateTime < DATEADD (day , 1 , '[email protected]_Date+'))' select @csvSQL select @csv = 'bcp "'+ @csvSQL +'" queryout '[email protected]+' -c -t, -T -S' [email protected]@servername exec master..xp_cmdshell @csv

Когда я запускаю его, это выглядит как «Типы данных varchar и uniqueidentifier несовместимы в операторе добавления». ошибка

Когда я меняю компанию на строку вместо переменной в запросе, она отлично работает, но ошибки на ней.

set @csvSQL = 'SELECT TOP (100) [KICSDEV].dbo.MOVIEDETAIL.Title , [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.MemberId, [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.CreateDateTime as ''DateTime'' FROM [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG INNER JOIN [KICSDEV].dbo.MOVIEDETAIL ON [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.MovieDetailId = [KICSDEV].dbo.MOVIEDETAIL.MovieDetailId INNER JOIN [KICSDEV].dbo.MEMBER ON [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.MemberId = [KICSDEV].dbo.MEMBER.MemberId INNER JOIN [KICSDEV].dbo.CINEMA ON [KICSDEV].dbo.MEMBER.CinemaId = [KICSDEV].dbo.CINEMA.CinemaId WHERE ([KICSDEV].dbo.CINEMA.CompanyId = ''189be460-99d1-42e9-b4ed-8de6f8724ce8'' and [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.CreateDateTime >= ' + @p_Date +' and [KICSDEV].dbo.MEMBERMOVIEPURCHASELOG.CreateDateTime < DATEADD (day , 1 , '[email protected]_Date+'))'

Конверсия не удалась при преобразовании даты и/или времени из символьной строки.

Я думаю, что это как-то связано со всеми разделителями и типами данных.

stackoverrun.com

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

Как экспортировать результат запроса в CSV-файл в SQL Server 2008?

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

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

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

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

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

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

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

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

Удачи!

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

$AttachmentPath = "CV File location" $QueryFmt= "Query" Invoke-Sqlcmd -ServerInstance Server -Database DBName -Query $QueryFmt | Export-CSV $AttachmentPath

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

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

использование 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 должен будет уже существовать. Если вы используете заголовки ( HDR=YES), убедитесь, что первая строка файла .CSV представляет собой список с разделителями всех полей.

Building on N.S's answer, I have a PowerShell script that exports to a CSV file with the quote marks around the field and comma separated and it skips the header information in the file.

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"

The first two lines enable the ability to use the Invoke-SqlCmd command-let.

MS Excel -> Data -> New Query -> From Database ..follow the steps

Using the native SQL Server Management Studio technique to export to CSV (as @8kb suggested) doesn't work if your values contain commas, because SSMS doesn't wrap values in double quotes. A more robust way that worked for me is to simply copy the results (click inside the grid and then CTRL-A, CTRL-C) and paste it into Excel. Then save as CSV file from Excel.

programmerz.ru