Имя: Пароль:
IT
 
из 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 сама задаст этой строкой? если сама то конечно надо.