Если у Вас возникла необходимость выгружать данные из базы 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
Заметка! Если Вы не знаете, что делает вышеуказанная инструкция, рекомендую посмотреть мой видеокурс «T-SQL. Путь программиста от новичка к профессионалу. Уровень 1 – Новичок», который предназначен для начинающих. В нем подробно рассмотрены все базовые конструкции языка T-SQL.
И эти данные нам нужно выгрузить в 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++.
Видим, что нужные данные у нас выгрузились и разделитель точка с запятой, все как мы и хотели.
На этом все, удачи!