![]() |
|
Модераторы: Akina |
![]()
|
|
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
Требуется импортировать данные из Excel файлов в таблицу MS SQL
В SQL таблица состоит из колонок Col1, Col2 ... Col30 тип ntext Надо сделать импорт в эту таблицу произвольного Excel файла (структура может меняться, т.е. набор и количество колонок не постоянно) определенных колонок, т.е. не все подряд, а только допустим 3, 4 и 12 в соответствующие колонки таблицы MS SQL, т.е. 3 колонка в Col3, 4 в Col4, 12 в Col12 и начиная с определенной строки, например с 20 и до конца. Все осложняется тем, что может быть задан произвольный фильтр парсинга, например 4 колонка больше 60, соответственно загружаются все строки, у которых значение в четвертой колонке больше 60, фильтров может быть несколько. Второе больше не усложнение, а условие - файл Excel находится на другом сервере в сети и доступен через шару. PS Данный механизм реализован на Perl, т.е. perl парсит Excel файл и с помошью запросов вставляет это в таблицу, но работает все это очень медлено файл Excel на 16000 строк и 20 колонок парсится около 1-2 минут. Загрузка процессора под 100%, весь отжирается памяти примерно вес файла *3 и загружается сеть, т.к. perl стоит там же, где лежит Excel - на другом сервере. Загрузку файла на 50000 строк, я так и не дождался ЗЫ Самый главный вопрос, если это реализовать средствами MS SQL, если это, конечно, впринципе возможно, будет ли это работать быстрее и меньше грузить процессор, память и сеть? |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
А почему не реализовать это собсно средствами VBA? прямо из модулёчка в самом этом Эксельном файле?
Или, например, промежуточная ADP-шка. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Magnifico |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 23.1.2008 Где: Московская област ь Репутация: 10 Всего: 17 |
для 2005 open rowset
-------------------- Всё в порядке - спасибо зарядке ! |
|||
|
||||
| SharedNoob |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 25.6.2007 Где: UA Репутация: 2 Всего: 5 |
А собственно ДТС пакет не выход ?
|
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
Потому-что это используется в интернет-магазине, написанном на perl, а файл Excel - это прайсы поставщиков, которые загружаются, сверяются с существующими товарами поставщика, корректируются цены и д.р. параметры товаров в магазине и добавляются новые - нет возможности добавить в Excel доп обработчики, т.к. файлы не наши, и обяснять как это делать каждому менеджеру после получения файла, собственно говоря не хочется У нас 2000 и пока никаких причин, чтобы покупать 2005 нет, хотя это может стать причиной, вопрос в скорости работы... насколько быстро данный запрос откроет файл на 10 мегов? Добавлено через 2 минуты и 2 секунды Вообще не выход, т.к. Какие колонки импортировать а какие нет - определяет менеджер при импорте, и файлы у всех поставщиков очень уж разные |
|||
|
||||
| Magnifico |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 23.1.2008 Где: Московская област ь Репутация: 10 Всего: 17 |
локальный xls на 10,3 мега
в менеджмент студио за 23 секунды 44392 строк -------------------- Всё в порядке - спасибо зарядке ! |
|||
|
||||
| SharedNoob |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 25.6.2007 Где: UA Репутация: 2 Всего: 5 |
Дык а чем не устраивает это ? возвращает набор данных который лежит в ексель файле .... да дальше вороти-нехачу . Добавлено @ 15:18 ой извеняюсь, недочитал ...sql2005 Добавлено @ 15:24 ДЛЯ SQL 2000 вариант 1
вариант 2
код на работоспособность не проверял но с драйвером для DBF все пашет Это сообщение отредактировал(а) SharedNoob - 13.3.2008, 15:27 |
||||||||
|
|||||||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
А DefaultDir можно задать как \\server\files\?
Это сообщение отредактировал(а) Itsys - 13.3.2008, 15:42 |
|||
|
||||
| SharedNoob |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 25.6.2007 Где: UA Репутация: 2 Всего: 5 |
QA => F1 => поиск по указателю => OPENDATASOURCE (или OPENROWSET) => enter
и читаем. ps для начала прочитайте данные с локального компьютера, а потом можно и подключить сетевой диск если что. Это сообщение отредактировал(а) SharedNoob - 13.3.2008, 15:54 |
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
||||
|
||||
| Itsys |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
Только парсит он не правильно В файле Excel строка:
А он выдает:
Почему некоторые значения изменены на NULL? |
||||||
|
|||||||
| Magnifico |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 23.1.2008 Где: Московская област ь Репутация: 10 Всего: 17 |
Могут разные тиы данных в одном столбце:
1 2 3 4 5 6 7А 7A это потенциальный нулл - ошибка преобразования если не принципиальны типы данных: приводить столбцы эксель к строке
-------------------- Всё в порядке - спасибо зарядке ! |
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
С Excel-ем сделать ничего не могу.... т.к.
Есть друие предложения и варианты? PS хотелось бы сделать все без вмешательства пользователей - получил файл по почте - загрузил в back-office интернет-магазина и все - дальше система сама все обрабатывет, менеджеру надо только подтверждать выполнение определнных действий.. |
|||
|
||||
| Magnifico |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 23.1.2008 Где: Московская област ь Репутация: 10 Всего: 17 |
попробуй с cast(ПОЛЕ as nvarchar(255)) поиграться
если использовать эксель в качестве источника данных ADO ,OLE то полюбому будет приводится столбец к определенному типу данных (которых больше в столбце) и будут ошибки преобразования. Только банально перебирать столбцы и строки и приводить каждую ячейку к определн формату для обработки грязных юзерских данных может и понадобится сложные обработчики писать и не в SQLSERVERE да и ресурсоемкое это занятие -------------------- Всё в порядке - спасибо зарядке ! |
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
Проблема только в том, что исходный файл произвольный, т.е. изначально не известно даже сколько колонок в файле, заголовки полей моут стоять в любой строке файла - моут в первой, а могут и в 20, так как в приведенном выше примере, и, первым делом чего я хочу сделать, так это получить хотябы список полей, а он мне вместо заголовка поля выдает NULL.
Есть ли способ CASTить все поля запроса в VARCHAR без их конкретного указания, ну типа CAST(* AS VARCHAR(5000))? |
|||
|
||||
| Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: нет Всего: 7 |
Возможно, имеет смысл накидать простейшую софтину в Delphi\Builder\VS в которой просто открывать файл и указывать самому какие столбцы и с какой строчки импортировать и в какое поле БД. И пусть эта софтина все в базу кидает. Может этот процесс займет несколько минут, но ведь вы явно не по 50 файлов в день получаете. А пытаться все предусмотреть в том числе как будет названо поле с названием товара, например, "товар", "наименование" или даже "название фильма", если торгуете DVD-дисками, нереально.
Импорт в сам Excel текстовых файлов сделан именно так. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
| Magnifico |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 23.1.2008 Где: Московская област ь Репутация: 10 Всего: 17 |
есть еще опции HDR=Yes;IMEX=1;
http://connectionstrings.com/?carrier=excel "HDR=Yes; считает первую строку заголовком полей "IMEX=1;" интерпретирует данные как текст -------------------- Всё в порядке - спасибо зарядке ! |
|||
|
||||
| Magnifico |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 23.1.2008 Где: Московская област ь Репутация: 10 Всего: 17 |
используй лучше оле дб он покорректней работает
-------------------- Всё в порядке - спасибо зарядке ! |
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
Сработало!!!!
Beltar, Обработка на perl уже написана, толь проблема в том, что грузится очень долго, вот и ищу возможность быстрее обработать данные. |
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
Только обрадовался.... по условию я не знаю название листа, и мне надо выбрать первый из существующих. Как указать не название листа sheet1$, а его порядковый номер?
|
|||
|
||||
| Magnifico |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 23.1.2008 Где: Московская област ь Репутация: 10 Всего: 17 |
-------------------- Всё в порядке - спасибо зарядке ! |
|||
|
||||
| Itsys |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
Вопрос только в том, как это запустить, а потом еще и желательнов запрос передать... мне сами именя листов не нужны, мне надо выбирать данные из первого листа в файле, может можно это как-нибудь задать не перебирая с помощью VB файл?
И так
и так
пробовал... |
||||
|
|||||
| Magnifico |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 23.1.2008 Где: Московская област ь Репутация: 10 Всего: 17 |
excel -> (alt + F11)(Редактор VB) - > insert ->module ->копироватьКодСюда ->правим пути в коде ->RUN Ole automation это единственный способ добраться к свойствам и методам Эксель Все языки программирования интегрируются с Эксель именно так, (и ничего другого кроме вышеприведенного кода не придумаешь) Никаким запросом имена листов узнать невозможно Эксель не база данных ,и нет возможности получить Информационную схему
Если хочешь помучиться в 2000 есть расширенные хранимые процедуры на c++ (Visual Studio 6 ) (у меня на с++ "аллергия") В БОЛЕ набрать OLE Automation там есть какие то методы работы , можно вызывать VBA методы и св-ва (не разбирался) ищи хороший пример Или писать прогу на любом языке ,опять же интеграция с Эксель(код вверху) подключение к sql server -> передача параметров из встроенного VBA в хранимую процедуру (с openrowsetoM)
Вот из за этой казалось мелочи придется сильно помучиться (от Vba не убежишь) -------------------- Всё в порядке - спасибо зарядке ! |
||||||
|
|||||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
В общем решил я отказаться от этой затеи, т.к. срорее всего никакого убыстрения по сравнению с существующей обработкой на Perl я не получу.
Еще раз спасибо. |
|||
|
||||
| Magnifico |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 23.1.2008 Где: Московская област ь Репутация: 10 Всего: 17 |
в 2005 это работает:
-------------------- Всё в порядке - спасибо зарядке ! |
|||
|
||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
Насколько я понимаю, это все работает не очень быстро |
|||
|
||||
| Magnifico |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 23.1.2008 Где: Московская област ь Репутация: 10 Всего: 17 |
Это работает мгновенно!
Получить имя первого листа первой открытой книги- какая же здесь может быть нагрузка
я просто незнаю будет ли работать в 2000? Что то ты рано сдался! Это то что доктор прописал !!!!!!!!!!!!!!!! Одна тонкость Workbooks(1).Sheets(1).Name -мы получаем имя первого листа первой открытой книги,если будет открыта другая книга, допустим локально , а потом будет выполнен этот запрос -то подхватит именно эту книгу ,а
будет уже второй... Из этого следует лучше обращаться к книге по имени (надюсь её название хотя бы известно или тоже скрипт писать ,перебирая все эксель файлы?
в 2000 OLE Automation должно как то включаться (поиск) -------------------- Всё в порядке - спасибо зарядке ! |
||||||
|
|||||||
| Itsys |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1338 Регистрация: 21.1.2008 Где: г. Москва Репутация: 1 Всего: 34 |
Ну попробую.... насколько я знаю, OLE в принципе не самый быстрый способ, т.к. при его использовании загружается приложение сервер - это раз, считывается в память файл - это два и только потом можно из него чего-нибудь получить.
|
|||
|
||||
![]()
|
| Правила форума "MS SQL" | |
|
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MS SQL Server | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |