很多时候我们都知道使用.net代码去读取word,excel文档,但是我们如何使用sql句语里读取excel文件呢:SQL2005为我们提供了OPENROWSET来访问各种数据源:,当然我还是建议使用.net代码来读取这些文件。这里就不多说了。

我们先看一下官方的解释:

包含访问 OLE DB 数据源中的远程数据所需的全部连接信息。当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用 OLE DB 连接并访问远程数据的一次性的临时方法。对于较频繁引用 OLE DB 数据源的情况,请改为使用链接服务器。有关详细信息,请参阅链接服务器。可以在查询的 FROM 子句中像引用表名那样引用 OPENROWSET 函数。依据 OLE DB 访问接口的功能,还可以将 OPENROWSET 函数引用为 INSERT、UPDATE 或 DELETE 语句的目标表。尽管查询可能返回多个结果集,但 OPENROWSET 只返回第一个结果集。

语法

OPENROWSET 
( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password'    | 'provider_string' }       , {   [ catalog. ] [ schema. ] object     | 'query' 
     }    | BULK 'data_file' ,        { FORMATFILE = 'format_file_path' [ <bulk_options> ]        | SINGLE_BLOB | SINGLE_CLOB | SINGLE_NCLOB }
} ) 

<bulk_options> ::=    [ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]    [ , ERRORFILE = 'file_name' ]    [ , FIRSTROW = first_row ]    [ , LASTROW = last_row ]    [ , MAXERRORS = maximum_errors ]    [ , ROWS_PER_BATCH = rows_per_batch ] 
下面我们以一个例子来说明使用方法:
首先我们建立一个名为11.xls 的excel文档,文档的内容如下:
excel 
下面我们使用sql 语句来读取11.xls
select * 
from openrowset
  ('Microsoft.Jet.OLEDB.4.0',
  'Excel 8.0; Database=C:\Users\111\Desktop\11.xls',
  'select * from [Sheet1$]')
Database就是11.xls文件的路径。Sheet1是你excel表里的名字.
查询结果如下:
Name Age Title

John    25    Chair Man
Wendy    24    CEO

注意在使用这个sql语句的过程中,我们可能会碰到下面的错误

SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. For more information about enabling 'Ad Hoc Distributed Queries', see "Surface Area Configuration" in SQL Server Books Online

大概意思就是sqlserver 阻止了使用'OpenRowset/OpenDatasource'的组件,所以解决办法如下:

我们使用sql语句来开启这个功能

EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO

当然我们也可以使用SQL server的外围工具来配置如下图:

sqlarea

在Enamble OpenRowSet and OPENDTASOUCE SUPOORT 前面打上勾就ok了.

 

 

 

 

 
 
posted on 2009-01-08 15:43  John.Lau  阅读(1211)  评论(0编辑  收藏  举报