【问题标题】:Cannot import data from excel 2003 to database using openrowset function无法使用 openrowset 函数将数据从 excel 2003 导入数据库
【发布时间】:2012-03-28 08:46:27
【问题描述】:

这是我的笔记本电脑规格:

操作系统:Windows 7 - 64 位, 数据库:SQL SERVER 2008 R2, 微软办公软件:微软办公软件 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

,但我仍然收到错误消息。有人可以帮帮我吗?

【问题讨论】:

    标签: sql-server-2008 64-bit excel-2007 oledb import-from-excel


    【解决方案1】:

    OPENROWSET 函数的 SQL 查询:--

    1) 打开 SQL Server Management Studio

    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 的表。

    二。 Microsoft.Jet.OLEDB.4.0 是用于转换的驱动程序

    三。带路径的 Excel 文件 - D:\SQL Scripts\msp.xls

    四。包括 IMEX=1 属性,包含混合数据类型的列被视为字符串/文本数据类型。

    v. HRD =Yes 属性表示excel文件的第一行由列标题名称组成

    六。 Sheet1 是您要导入的工作表的名称

    七。 Excel 8.0指定为97-2003格式的excel文件

    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) 要复制预定义 SQL 表中的 excel 文件,请使用带有插入命令的 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 的文件,请使用

    选择 * INTO [dbo].[地址] FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0' ,'Excel 12.0;Database=D:\SQL Scripts\msp.xlsx;HDR=YES;IMEX=1' ,'SELECT * FROM [Sheet1$]')

    我。它将在当前选定的数据库中创建名称为 Addresses 的表

    二。 Microsoft.ACE.OLEDB.12.0 是用于转换的驱动

    三。带路径的 Excel 文件 - D:\SQL Scripts\msp.xlsx

    四。包括 IMEX=1 属性,包含混合数据类型的列被视为字符串/文本数据类型。

    v. HRD =Yes 属性表示excel文件的第一行由列标题名称组成

    六。 Sheet1 是您要导入的工作表的名称

    七。 Excel 12.0指定为2007-2010格式的excel文件

    7) 要复制预定义 SQL 表中的 excel 文件,请使用带有插入命令的 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$]')
    

    【讨论】:

    • 我仍然收到这样的错误: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.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2022-07-03
    相关资源
    最近更新 更多