|
из excel в MSSQL | ☑ | ||
---|---|---|---|---|
0
kodblack
12.02.15
✎
09:43
|
Добрый день!
Подскажите - как быть. Мне нужно из таблицы excel в автоматическом режиме производить выгрузку данных в БД SQL. На VBS - но выдает ошибку. Код Visual Basic Dim cn As ADODB.Connection Dim strSQL As String Dim lngRecsAff As Long Set cn = New ADODB.Connection cn.Open "Provider=SQLOLEDB;Data Source=<comp\sqlexpress>;" & _ "Initial Catalog=<test>;User ID=<sa>;Password=<pass>" 'Import by using OPENDATASOURCE. strSQL = "SELECT * INTO XLImport6 FROM " & _ "OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', " & _ "'Data Source=D:\111.xls;" & _ "Extended Properties=Excel 8.0')...[Customers$]" Debug.Print strSQL cn.Execute strSQL, lngRecsAff, adExecuteNoRecords Debug.Print "Records affected: " & lngRecsAff 'Import by using OPENROWSET and object name. strSQL = "SELECT * INTO XLImport7 FROM " & _ "OPENROWSET('Microsoft.Jet.OLEDB.4.0', " & _ "'Excel 8.0;Database=D:\111.xls', " & _ "[Customers$])" Debug.Print strSQL cn.Execute strSQL, lngRecsAff, adExecuteNoRecords Debug.Print "Records affected: " & lngRecsAff 'Import by using OPENROWSET and SELECT query. strSQL = "SELECT * INTO XLImport8 FROM " & _ "OPENROWSET('Microsoft.Jet.OLEDB.4.0', " & _ "'Excel 8.0;Database=D:\111.xls', " & _ "'SELECT * FROM [Customers$]')" Debug.Print strSQL cn.Execute strSQL, lngRecsAff, adExecuteNoRecords Debug.Print "Records affected: " & lngRecsAff cn.Close Set cn = Nothing Таблица excel типа NO ASD Latitude Longitude DF FG Kod_OK Pyncty_ 1 123 64.527386 40.561819 1545,55 55455,56 75.22 456546,56 |
|||
1
Andrewww123
12.02.15
✎
09:46
|
(0) Видимо, сейчас намекнут на текст ошибки.
|
|||
2
kodblack
12.02.15
✎
09:50
|
(1) хотелось бы :(
|
|||
3
rsv
12.02.15
✎
09:50
|
(0) Мутно как то все . Настройте для начала в скуле линкованный сервер на источник данных Exel. Через него будете читать через OpenQuery например. Постестите все в MS Manag Studio, а опосля уже ADO.
|
|||
4
bolobol
12.02.15
✎
09:56
|
(2) что такое? Ошибка есть, а текста ошибки нет, что ли?
|
|||
5
Andrewww123
12.02.15
✎
10:02
|
(2) Раз хотелось, намекаю :) Напиши текст ошибки.
|
|||
6
dk
12.02.15
✎
10:04
|
при коннекте к Excel нужно указывать что названия колонок берется из 1-й строки
попробуй HDR=Yes указать https://www.connectionstrings.com/microsoft-jet-ole-db-4-0/standard-excel/ |
|||
7
kodblack
12.02.15
✎
10:10
|
(5) Сценарий d:123.vbs
Строка 1 Символ 12 Ошибка Предполагается наличие окончания инструкции Код: 800А0401 |
|||
8
rsv
12.02.15
✎
10:26
|
Тренеруетесь ? :)
|
|||
9
kodblack
12.02.15
✎
10:33
|
(8) Вы о чем?
Может кто нибудь предложить нормальный способ импорта из excel в sql. Разве не у кого нет наработак. Буду очень признателен. |
|||
10
rsv
12.02.15
✎
10:36
|
(9) Правой кнопкой мыши на БД в Скуле . Все задачи . Импорт Данных . Откроется мастер импорта данных .
|
|||
11
kodblack
12.02.15
✎
10:39
|
(10) - это не ответ. мне нужен автоматический режим.
т.е Excel - будет обновляться время от времени, и надо что бы автоматически данные обновлялись в БД sql. |
|||
12
Andrewww123
12.02.15
✎
10:39
|
Как я понимаю, это синтаксис не vbs, но могу ошибаться.
|
|||
13
rsv
12.02.15
✎
10:41
|
(11) MS Скуль . Объекты сервера . Связанные серверы. Правой кнопокой мыши . Создать свзанный сервер. т.е. (3)
|
|||
14
kodblack
12.02.15
✎
10:47
|
(13) - а какой драйвер выбирать??? что то excel не нашел.
|
|||
15
rsv
12.02.15
✎
10:49
|
(14) Что нить с Jet там есть ?
|
|||
16
kodblack
12.02.15
✎
10:50
|
(15) нет
|
|||
17
rsv
12.02.15
✎
10:57
|
(16) попробуйте вот так программно создать по аналогии :
sp_addlinkedserver N'MyxlsServer', N'Jet 4.0', N'Microsoft.Jet.OLEDB.4.0', N'\\10.0.0.252\VShare\_User\ExcelTemplates\JourAssembly.xls', NULL, N'Excel 5.0' |
|||
18
kodblack
12.02.15
✎
11:09
|
(17) создан link server
но драйвер OLE DB Provider for SQL server и путь до файла с xls - не прописан |
|||
19
N1kMZ
12.02.15
✎
11:10
|
На стороне MS SQL проще делать. Через SSIS.
|
|||
20
kodblack
12.02.15
✎
11:12
|
(19) SSIS пакет не нашел :(
|
|||
21
Jaap Vduul
12.02.15
✎
11:36
|
Вот тут есть подробная инструкция с картинками для SSIS 2012:
https://www.simple-talk.com/sql/ssis/moving-data-from-excel-to-sql-server---10-steps-to-follow/ Это если инициировать загрузку со стороны сервера. Можно конечно делать это, запуская скрипт из шедулера windows. Но ваш код в таком случае не годится, ибо он написан, не на VBS, а на VBA и движок vbscript его не понимает (7). Вообще в этом случае я бы порекомендовал использовать PowerShell - в нём можно заюзать класс Data.SqlClient.SqlBulkCopy для быстрой заливки больших объёмов данных. Пример: http://www.sqlserver-dba.com/2013/01/sql-server-export-excel-data-to-sql-server-with-powershell.html |
|||
22
kodblack
12.02.15
✎
11:59
|
(21) спасибо - буду делать через ssis
|
|||
23
kodblack
12.02.15
✎
12:13
|
(21) т.е что бы добавить SSIS нужен VS?
|
|||
24
N1kMZ
12.02.15
✎
12:48
|
(23) Со стороны сервера лучше запускать, JOBом
|
|||
25
kodblack
12.02.15
✎
12:49
|
(24) а можно ссылку?
|
|||
26
kodblack
12.02.15
✎
12:50
|
нашел SSDTBI-VS2012 - написано что есть ssis
|
|||
27
N1kMZ
12.02.15
✎
12:50
|
(25) А на что ссылку? Создаётся job на SQL, в нём в качестве шага созданный ранее SSIS пакет. Ну а так документацию читать надо, в пост не влезет всё :)
|
|||
28
Господин ПЖ
12.02.15
✎
12:50
|
>т.е что бы добавить SSIS нужен VS
нужен нормальный скуль... или SSIS сейчас везде доступен по лицензии? |
|||
29
N1kMZ
12.02.15
✎
12:55
|
||||
30
rsv
12.02.15
✎
13:06
|
Так что с линком то не копали ? Там буков и телодвижений меньше .
|
|||
31
rsv
12.02.15
✎
13:07
|
+(30) и скорее скуль в (0) 64 разряда и не видит 32 разрядный Jet
|
|||
32
N1kMZ
12.02.15
✎
14:05
|
(31) SSIS пакет можно запускать в 32-разрядной среде принудительно (в свойствах пакета).
|
|||
33
kodblack
13.02.15
✎
07:46
|
(30) с линк сервером - не до понял что делать после добавления модуля.
|
|||
34
kodblack
13.02.15
✎
10:39
|
Добавил путем запроса.
А вот дальше не понял что делать. EXEC sp_addlinkedserver server = 'ExcelServer1', @srvproduct = 'Excel', @provider = 'Microsoft.Jet.OLEDB.4.0', @datasrc = 'd:\111.xls', @provstr = 'Excel 8.0;IMEX=1;HDR=YES;' |
|||
35
kodblack
13.02.15
✎
10:40
|
И провайдер - выставился другой - OLE DB
|
|||
36
kodblack
13.02.15
✎
11:08
|
почему в связи сервера нет для выбора Microsoft.Jet.OLEDB.4.0
я установил AccessDatabaseEngine_x64 |
|||
37
Jaap Vduul
13.02.15
✎
11:24
|
(36)
Для Jet.OLEDB нет x64 провайдера, надо использовать строку подключения для ACE.OLEDB: https://www.connectionstrings.com/ace-oledb-12-0/excel-97-2003-xls-files-with-ace-oledb-120/ |
|||
38
kodblack
13.02.15
✎
11:40
|
(37) Связь сделал. Но теперь сори за туп...ой вопрос - а как вогнать данные с таблицы в БД?
|
|||
39
Jaap Vduul
13.02.15
✎
11:44
|
(38)
Ну, вроде, по ссылке https://www.simple-talk.com/sql/ssis/moving-data-from-excel-to-sql-server---10-steps-to-follow/ всё разжёвано. Чего непонятно-то? |
|||
40
kodblack
13.02.15
✎
11:49
|
(39) - т.е что по ACE.OLEDB или по SSIS - путь один?
|
|||
41
Jaap Vduul
13.02.15
✎
11:54
|
(40)
Вопрос звучит как "т.е. дизель и мерседес с одинаковой скоростью едут?". |
|||
42
kodblack
13.02.15
✎
12:22
|
(41) тогда вопрос при настройке связи SQL Statement
простой запрос написал но выдает ошибку IF EXISTS (SELECT 1 FROM information_schema.tables where table_name like '1111') DROP TABLE 1111 -- create a table to hold purchase ledger items CREATE TABLE 1111( PRIMARY KEY IDENTITY(1,1), Naimenovanie nchar(10), Latitude float, Longitude float, Factiheskyi nchar(10), inn nchar(10), Kod_OKVED nchar(10), Pyncty nchar(10) ) [Задача "Выполнение SQL"] Ошибка: Сбой выполнения запроса "IF EXISTS (SELECT 1 FROM information_schema.tables..." со следующей ошибкой: "Неправильный синтаксис около конструкции "1111".". Возможные причины сбоя: проблемы с этим запросом, свойство "ResultSet" установлено неправильно, параметры установлены неправильно или соединение было установлено неправильно. |
|||
43
Jaap Vduul
13.02.15
✎
12:38
|
(42)
Не могут идентификаторы объектов в MSSQL начинаться с цифровых символов. https://msdn.microsoft.com/en-us/library/ms175874.aspx |
|||
44
kodblack
13.02.15
✎
13:09
|
(43) IF EXISTS (SELECT 1 FROM information_schema.tables where table_name like 'qwerty')
DROP TABLE qwerty -- create a table to hold purchase ledger items CREATE TABLE qwerty( PRIMARY KEY IDENTITY(1,1), Naimenovanie nchar(10), Latitude float, Longitude float, Factiheskyi nchar(10), inn nchar(10), Kod_OKVED nchar(10), Pyncty nchar(10) ) [Задача "Выполнение SQL"] Ошибка: Сбой выполнения запроса "IF EXISTS (SELECT 1 FROM information_schema.tables..." со следующей ошибкой: "Неправильный синтаксис около ключевого слова "IDENTITY".". Возможные причины сбоя: проблемы с этим запросом, свойство "ResultSet" установлено неправильно, параметры установлены неправильно или соединение было установлено неправильно. |
|||
45
kodblack
13.02.15
✎
13:11
|
(44) удалил PRIMARY KEY IDENTITY(1,1), и все заработало
|
|||
46
Jaap Vduul
13.02.15
✎
13:15
|
(44)
Надо было не удалять, а указать наименование первичного ключа, типа: Id PRIMARY KEY IDENTITY(1,1) Хотя, если первичный ключ не нужен, то и так сойдёт. |
|||
47
kodblack
13.02.15
✎
16:44
|
(46) он должен быть указан в таблице или sql сама задаст этой строкой? если сама то конечно надо.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |