Не удается импортировать данные из Excel 2003 в базу данных с помощью функции openrowset

Это характеристики моего ноутбука:

ОС: Windows 7 — 64-разрядная, База данных: SQL SERVER 2008 R2, Microsoft Office: Microsoft Office 2007,

Моя проблема: когда я запускаю процедуру импорта данных из excel 2003 (xls) в базу данных (SQL Server 2008), у меня возникает эта ошибка:

<span style="color:red">OLE DB provider 'Microsoft.Jet.OLEDB.4.0' cannot be used for 
      distributed queries because the provider is configured to run in 
      single-threaded apartment mode.</span>

это моя процедура:

SELECT * FROM  OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=d:\test.xls', 
                          'SELECT * FROM [Sheet1$]')

Я пытался исправить с помощью:

Установить AccessDatabaseEngine.exe

Запустите ниже на SQL:

EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
GO
EXEC sp_configure 'show advanced options', 1;
GO
EXEC sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 1
GO
EXEC sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 1

, но я все еще получаю сообщение об ошибке. Кто-нибудь может мне помочь?


person Andy Kurniawan    schedule 28.03.2012    source источник


Ответы (1)


SQL-запрос для функции OPENROWSET: --

1) Откройте студию управления SQL Server.

2) Откройте панель запросов и напишите следующие команды

3) Для файлов Excel 97 – 2003, то есть файлов с расширением XLS, используйте

SELECT * INTO [dbo].[Addresses]
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:\SQL Scripts\msp.xls;IMEX=1;HRD=Yes','SELECT * FROM [Sheet1$]')

я. Он создаст таблицу с именем Addresses в текущей выбранной базе данных.

II. Microsoft.Jet.OLEDB.4.0 — драйвер, используемый для преобразования

III. Файл Excel с путем — D:\SQL Scripts\msp.xls

IV. При включенном свойстве IMEX=1 столбцы, содержащие смешанные типы данных, обрабатываются как строковые/текстовые типы данных.

v. Свойство HRD = Yes означает, что верхняя строка файла Excel состоит из имени заголовка столбца.

ви. Sheet1 — это имя листа, который вы хотите импортировать.

vii. Excel 8.0 указывает, что это файл Excel формата 97 — 2003.

4) Чтобы использовать запрос фильтра, пользователь может использовать предложение where также с этой командой, например

SELECT * INTO [dbo].[Addresses]
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:\SQL Scripts\msp.xls;IMEX=1;HRD=Yes','SELECT * FROM [Sheet1$]') where [column_name]=’value’

5) Чтобы скопировать файл excel в предопределенную таблицу SQL, используйте функцию OPENROWSET с командой вставки, например: -

Create table Custom (Source_IP_ADD varchar(20),API_NAME varchar(50),COUNT_NO varchar(5),CLIENT_ID varchar(50),Date_OF_INVOKE varchar(50))

INSERT INTO [dbo].[Custom] ( [Source_IP_ADD], [API_NAME], [COUNT_NO], [CLIENT_ID], [Date_OF_INVOKE])

    SELECT [Source_IP_ADDR], [API_NAME], [COUNT_NO], [CLIENT_ID], [Date_INVOK] FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=D:\SQL Scripts\msp.xls;IMEX=1;HRD=Yes','SELECT * FROM [Sheet1$]')

6) Для файлов Excel 2007–2010, то есть файлов с расширением XLSX, используйте

SELECT * INTO [dbo].[Адреса] FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;Database=D:\SQL Scripts\msp.xlsx;HDR=YES;IMEX=1','SELECT * ОТ [Лист1$]')

я. Он создаст таблицу с именем Addresses в текущей выбранной базе данных.

II. Microsoft.ACE.OLEDB.12.0 — это драйвер, используемый для преобразования

III. Файл Excel с путем — D:\SQL Scripts\msp.xlsx

IV. При включенном свойстве IMEX=1 столбцы, содержащие смешанные типы данных, обрабатываются как строковые/текстовые типы данных.

v. Свойство HRD = Yes означает, что верхняя строка файла Excel состоит из имени заголовка столбца.

ви. Sheet1 — это имя листа, который вы хотите импортировать.

vii. Excel 12.0 указывает, что это файл Excel формата 2007–2010 гг.

7) Чтобы скопировать файл excel в предопределенную таблицу SQL, используйте функцию OPENROWSET с командой вставки, например: -

Create table Custom (Source_IP_ADD varchar(20),API_NAME varchar(50),COUNT_NO varchar(5),CLIENT_ID varchar(50),Date_OF_INVOKE varchar(50))

INSERT INTO [dbo].[Custom] ( [Source_IP_ADD], [API_NAME], [COUNT_NO], [CLIENT_ID], [Date_OF_INVOKE])
SELECT [Source_IP_ADDR], [API_NAME], [COUNT_NO], [CLIENT_ID], [Date_INVOK] FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0' ,'Excel 12.0;Database=D:\SQL Scripts\msp.xlsx;HDR=YES;IMEX=1' ,'SELECT * FROM [Sheet1$]')
person Yoko Zunna    schedule 28.03.2012
comment
Я все еще получаю сообщение об ошибке: Msg 7308, Level 16, State 1, Line 1 OLE DB provider 'Microsoft.Jet.OLEDB.4.0' cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode. - person Andy Kurniawan; 28.03.2012