Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Загрузка в MSSQL выборочных данных из Excel  [new]
hensX
Member

Откуда:
Сообщений: 5
Добрый день!
Может кто-нибудь сталкивался? А может кому-то и пригодиться ))))

Постановка задачи:
Средствами MSSQL (!!! именно mssql, как сделать другими способами - я знаю) загрузить из Excel данные в определенную таблицу MSSQL. Вроде все просто...
А теперь нюансы: данные для каждой строки таблицы MSSQL хранятся в произвольных ячейках Excel. Правила (построчно) заданы в xml... Пример:
...
<data>
   <param id="1" adr="G56" />
   <param id="2" adr="A2" />
   <param id="3" adr="D13" />
   <param id="4" adr="J23" />
</data>
<data>
   <param id="1" adr="K14" />
   <param id="2" adr="A3" />
   <param id="3" adr="D13" />
   <param id="4" adr="B31" />
</data>
...

Т.е. обращаться к исходному Excel файлу приходится поэлементно. Трудностей, КАК это делать нет:
- для начала линкуем Excel (обязательно HDR=NO и IMEX=1);
- далее парсим xml, определяем, какие ячейки надо считать;
- считываем:

SELECT *
FROM OPENQUERY('lsXLS', --Linked Server к Excel
   'SELECT *
    FROM [Лист1$C4:C4]')


И все в принципе работает... НО!!! Такое решение "в лоб" привело к тому, что ~8000 обращений к Excel выполняется >4 мин., что не приемлемо...
Как я понимаю, каждый вызов OPENQUERY устанавливает соединение с Excel, открывает, считывает данные, закрывает... Что требует времени...

А теперь вопросы знатокам:

1. Возможно ли в MSSQL сделать что-то типа потока к Excel... Чтобы файл не открывался-закрывался при каждом вызове OPENQUERY?

2. Можно попробовать обойти эту проблему, считав полностью файл Excel во временную таблицу, НО (!!!) в этом случае я не буду знать строк к которым обратиться - номеров строк в MSSQL, как в Excel нет (а я знаю только точный адрес ячейки)...
Так вот... Можно ли как-то считать Excel с номерами строк? Что-то типа:
SELECT *
FROM OPENQUERY('lsXLS', --Linked Server к Excel
   'SELECT <СТРОКА() или ROW_NUMBER> as RowNum, *
    FROM [Лист1$]')

Если получится считать Excel с номерами строк, то адресация останется, а обращаться к таблице MSSQL - гораздо интереснее )))
27 фев 15, 13:27    [17320776]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка в MSSQL выборочных данных из Excel  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
Вы не хотите воспользоваться библиотекой https://msdn.microsoft.com/en-us/library/dd452407(v=office.12).aspx
27 фев 15, 13:52    [17320984]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка в MSSQL выборочных данных из Excel  [new]
hensX
Member

Откуда:
Сообщений: 5
a_voronin,

))) да я готов хоть на чем сделать данный импорт... Но условие - T-SQL...
27 фев 15, 14:01    [17321051]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка в MSSQL выборочных данных из Excel  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4264
Как вариант - взять формат xlsx.
Там данные лежат в XML формате.
Правда придется сначала разархивировать, так как они сжаты.
27 фев 15, 15:41    [17321800]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка в MSSQL выборочных данных из Excel  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
hensX
a_voronin,

))) да я готов хоть на чем сделать данный импорт... Но условие - T-SQL...


CLR функция
27 фев 15, 18:00    [17322628]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка в MSSQL выборочных данных из Excel  [new]
hensX
Member

Откуда:
Сообщений: 5
Пока придумал вот такие костыли ))) Вроде работает...

SELECT * 
INTO Table1
FROM OPENQUERY(lsXls, -- линкованый XLS
               'select * from [&#203;&#232;&#241;&#242;1$]')
    
ALTER TABLE Table1 ADD nRowNum int IDENTITY(1,1) NOT NULL


Столбцы F1, F2, F3, ... напоминаю - HDR=NO
Строки тоже пронуменованы в новом добавленном столбце... Понятно, что теоретически порядок строк может быть произвольный, но при считывании их XLS он вроде сохраняется...

Т.о. немного через не пойми чего считал файл из Excel в MS SQL с сохранением возможности адресации к ячейке...
3 мар 15, 18:10    [17339049]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка в MSSQL выборочных данных из Excel  [new]
hensX
Member

Откуда:
Сообщений: 5
Извиняюсь... ))) Не так
...         
'select * from [&#203;&#232;&#241;&#242;1$]'
...

, а так:
...         
'select * from [Лист1$]'
...
3 мар 15, 18:44    [17339144]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка в MSSQL выборочных данных из Excel  [new]
Glory
Member

Откуда:
Сообщений: 104760
hensX
Пока придумал вот такие костыли ))) Вроде работает...

SELECT *, IDENTITY(int, 1,1) as  nRowNum 
INTO Table1
FROM OPENQUERY(lsXls, -- линкованый XLS
               'select * from [Лист1$]')
3 мар 15, 20:41    [17339568]     Ответить | Цитировать Сообщить модератору
 Re: Загрузка в MSSQL выборочных данных из Excel  [new]
hensX
Member

Откуда:
Сообщений: 5
Glory,

О!!!! Точно, полшага не хватило додуматься до такой интерпретации решения )))) Спасибо за уточнения, так, конечно, элегантнее )))
4 мар 15, 09:11    [17340733]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить