Экспорт-импорт в excel MSSQL x64 Microsoft.ACE.OLEDB.12.0

shandai
Дата: 15.02.2013 15:24:01
Добрый день! тема избитая, но все равно не получается запустить хотябы чтение из excel MSSQL x64.
Исходные данные:
1.Версия
select @@Version

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2)

2.Зарегестированные драйверы для работы с офисом
EXEC sp_enum_oledb_providers

Microsoft.ACE.OLEDB.12.0

3. Excel файл "MySheet3.xls" (создан в 2003) с одним единственным листом "Range". (на самом сервере excel не установлен).

Что делаю:
1. Даём разрешение для драйвера
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1 


2. включаем xp_cmdshell
begin
EXEC sp_configure 'xp_cmdshell',1
reconfigure with override;
end


3. Создаём прилинкованный сервер:
EXEC master.dbo.sp_addlinkedserver
      @server = N'LS_EXCEL', 
      @srvproduct=N'ms ace 12', 
      @provider=N'Microsoft.ACE.OLEDB.12.0', 
      @datasrc=N'c:\data\MySheet3.xls', 
      @provstr=N'Excel 12.0;'


4. В свойствах Linked Server в графе безопасность ставлю "Устанавливать без контекста безопасности"

5. Проверяю через Management Studio->Server Objects->Linked Server->Test Connection есть ли связь с созданным сервером,
пишет: "Выполнено успшно".

6. Проверяем доступность файла:
exec master..xp_cmdshell 'dir c:\data\MySheet3.xls'

резултат (доступность есть):
- Volume in drive C is system
- Volume Serial Number is 4406-D1E3
- NULL
- Directory of c:\data
- NULL
- 02/15/2013 08:49 PM 13,824 MySheet3.xls
- 1 File(s) 13,824 bytes
- 0 Dir(s) 16,385,438,720 bytes free
- NULL

7. Пробуем считать данные:
SELECT * FROM [LS_EXCEL]...[Range]

результат (ортиацательный):
"Msg 7314, Level 16, State 1, Line 1
Поставщик OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "LS_EXCEL" не содержит таблицы "Range". Таблица либо не существует, либо текущий пользователь не имеет разрешения на доступ к ней."

8. В ексель файл вставляю поименованный диапазон с таким же названием как и лист: Range
9. Перелинковываю заново сервер, проверяю связь и доступность все ок, пробуюу считать данные, результат другой:
Во вкладке результаты появляются заголовки столбцов 1,11,12,13 и все, данных нет, и следующие сообщения:
"Msg 7399, Level 16, State 1, Line 1
Поставщик OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "LS_EXCEL" сообщил об ошибке. Отказано в доступе.
Msg 7301, Level 16, State 2, Line 1
Не удалось получить требуемый интерфейс ("IID_IDBCreateCommand") от поставщика OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "LS_EXCEL"."


при сипользовании OPENDATASOURCE все один в один как и выше, в том числе с диапазоном:
select*
 FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0',
'Data Source=c:\data\MySheet3.xls;Extended Properties=EXCEL 12.0')...[Range] ;


Что сделано не так?
Glory
Дата: 15.02.2013 15:25:41
shandai
7. Пробуем считать данные:
SELECT * FROM [LS_EXCEL]...[Range]


результат (ортиацательный):
"Msg 7314, Level 16, State 1, Line 1
Поставщик OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "LS_EXCEL" не содержит таблицы "Range". Таблица либо не существует, либо текущий пользователь не имеет разрешения на доступ к не

exec sp_tables_ex 'LS_EXCEL'
PVC
Дата: 15.02.2013 15:29:34
shandai,

а если ..[Range$]

?
Slava_Nik
Дата: 15.02.2013 16:18:51
shandai,
поробуй через OPENQUERY, и в запросе делай преобразование типов, для теста можно сначало в строку преобразовать,
либо попробуй по столбцам сделать запросы, т.к у тебя отобразились поля(...результаты появляются заголовки столбцов 1,11,12,13... ), но нет данных, то видно что-то с типами данных.
shandai
Дата: 16.02.2013 05:52:53
[/b]
Glory
shandai
7. Пробуем считать данные:
SELECT * FROM [LS_EXCEL]...[Range]

результат (ортиацательный):
"Msg 7314, Level 16, State 1, Line 1
Поставщик OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "LS_EXCEL" не содержит таблицы "Range". Таблица либо не существует, либо текущий пользователь не имеет разрешения на доступ к не

exec sp_tables_ex 'LS_EXCEL'

Ни чего не выводит, все пусто. Может так и должно быть с файлами excel?

PVC
shandai,
а если ..[Range$]
?

Без изменений, всё тоже самое.

Slava_Nik
shandai,
поробуй через OPENQUERY, и в запросе делай преобразование типов, для теста можно сначало в строку преобразовать,
либо попробуй по столбцам сделать запросы, т.к у тебя отобразились поля(...результаты появляются заголовки столбцов 1,11,12,13... ), но нет данных, то видно что-то с типами данных.


Вот так делал:

select * from openquery (LS_EXCEL,'select CAST(1 AS nvarchar) from Range')
select * from openquery (LS_EXCEL,'select CAST(1 AS nvarchar) from [Range]')
select * from openquery (LS_EXCEL,'select CAST(1 AS nvarchar) from [Range$]')

Выдаёт ошибку во всех случаях: Msg 7399, Level 16, State 1, Line 1
Поставщик OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "LS_EXCEL" сообщил об ошибке. Поставщик не предоставил данных об ошибке.
Msg 7321, Level 16, State 2, Line 1
Ошибка при подготовке запроса "select CAST(1 AS nvarchar) from [Range$]" к выполнению при помощи поставщика OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "LS_EXCEL".



Если сделать запрос openquery без преобразования типа
select * from openquery (LS_EXCEL,'select * from [Range$]')
select * from openquery (LS_EXCEL,'select 1 from [Range$]')

В случае с указнием вывода всех столбцов (*) также как и при прилинкованном сревере система выводит только заголовки столбцов 1,11,12,13 (без данных) и дальше ошибки:
Msg 7399, Level 16, State 1, Line 1
Поставщик OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "LS_EXCEL" сообщил об ошибке. Отказано в доступе.
Msg 7350, Level 16, State 2, Line 1
Не удалось получить сведения о столбце от поставщика OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "LS_EXCEL".

В случае с указнием конкретного столбца 1 (select 1 from...) система выводит его заголовок с имением "Expr1000" и выдаёт ошибки так же как и при "select * from...."

[b]Ни чего не происходит... что еще можно покапать?
Glory
Дата: 18.02.2013 10:26:52
shandai
Ни чего не выводит, все пусто. Может так и должно быть с файлами excel?

Нет, там должен быть список таблиц линкед сервера
Slava_Nik
Дата: 18.02.2013 14:42:29
[quot shandai][/b]
Glory
пропущено...


select * from openquery (LS_EXCEL,'select CAST(1 AS nvarchar) from Range')
select * from openquery (LS_EXCEL,'select CAST(1 AS nvarchar) from [Range]')
select * from openquery (LS_EXCEL,'select CAST(1 AS nvarchar) from [Range$]')

Выдаёт ошибку во всех случаях: Msg 7399, Level 16, State 1, Line 1
Поставщик OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "LS_EXCEL" сообщил об ошибке. Поставщик не предоставил данных об ошибке.
Msg 7321, Level 16, State 2, Line 1
Ошибка при подготовке запроса "select CAST(1 AS nvarchar) from [Range$]" к выполнению при помощи поставщика OLE DB "Microsoft.ACE.OLEDB.12.0" для связанного сервера "LS_EXCEL".




[b]Ни чего не происходит... что еще можно покапать?


не могу сказать, но функция CAST(1 AS nvarchar) эта фукнкция Экселя, он понимает данную функцию?
в запросе надо преобразовывать именно средствами Экселя.
pio777
Дата: 18.02.2013 17:12:37
Попробуйте:
sp_configure 'show advanced options',1
reconfigure with override
go
sp_configure 'Ad Hoc Distributed Queries',1
reconfigure with override
go


После этого должно заработать:
SELECT * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0','Data Source=c:\data\MySheet3.xls;Extended Properties=EXCEL 12.0')...[Range$] ;
pio777
Дата: 18.02.2013 17:27:59
А чтоб заработал Linked Server попробуйте запустить:
exec sp_addlinkedsrvlogin N'LS_EXCEL', 'False'


После этого должно работать:
SELECT * FROM [LS_EXCEL]...[Range$]
kain111
Дата: 20.02.2013 09:04:17
не знаю осталась ли ошибка, но 32х битный ODBC конекты не видятся 64х битными драйверами. а поставить 64х битный и 32х битный драйвер ODBC доступа одновременно к Excel 2 года назад не было возможным.
http://разработка-хд.рф/blog/?p=30
Может у вас с этим проблема.