OPENROWSET(Mssql-Excel)

OPENROWSET

包含访问 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' }
)

参数

'provider_name'

字符串,它代表在注册表中指定的 OLE DB 提供程序的友好名。provider_name 没有默认值。

'datasource'

字符串常量,它对应着某个特定的 OLE DB 数据源。datasource 是将被传递到提供程序 IDBProperties 接口以初始化提供程序的 DBPROP_INIT_DATASOURCE 属性。通常,这个字符串包含数据库文件的名称、数据库服务器的名称,或者提供程序能理解的用于查找数据库的名称。

'user_id'

字符串常量,它是传递到指定 OLE DB 提供程序的用户名。user_id 为连接指定安全上下文,并将它作为 DBPROP_AUTH_USERID 属性传递进来以初始化提供程序。

'password'

字符串常量,它是将被传递到 OLE DB 提供程序的用户密码。当初始化提供程序时,将 password 作为 DBPROP_AUTH_PASSWORD 属性传递进来。

'provider_string'

提供程序特定的连接字符串,将它作为 DBPROP_INIT_PROVIDERSTRING 属性传递进来以初始化 OLE DB 提供程序。通常 provider_string 封装初始化提供程序所需的所有连接信息。

catalog

目录或数据库的名称,其中驻留着指定的对象。

schema

架构的名称或指定对象的对象所有者名称。

object

对象名称,它唯一地标识出将要操作的对象。

'query'

是字符串常量,发送到提供程序并由提供程序执行。Microsoft® SQL Server™ 不处理该查询,但处理由提供程序返回的查询结果(直接传递查询)。对于有些提供程序,它们并没有通过表名而是通过命令语言表现自己的表格格式数据,那么将直接传递查询用于这些提供程序是非常有用的。只要查询提供程序支持 OLE DB Command 对象及其强制接口,那么在远程服务器上就支持直接传递查询。有关更多信息,请参见 SQL Server OLE DB 程序员参考

注释

如果 OLE DB 提供程序在指定的数据源中支持多个目录和架构,那么就需要目录及架构名称。如果 OLE DB 提供程序并不支持目录和架构,那么可以省略 catalog schema 的值。

如果提供程序只支持架构名,那么必须指定一个两部分名称,形式为 schema.object。如果提供程序只支持目录名,那么必须指定一个三部分名称,形式为 catalog.schema.object

OPENROWSET 不接受参数变量。

权限

OPENROWSET 权限由传递到 OLE DB 提供程序的用户名的权限确定。

示例
A. 将 OPENROWSET 与 SELECT 语句及用于 SQL Server 的 Microsoft OLE DB 提供程序一起使用

下面的示例使用用于 SQL Server 的 Microsoft OLE DB 提供程序访问 pubs 数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器上。从 datasourceuser_idpassword 中初始化提供程序,并且使用 SELECT 语句定义返回的行集。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('SQLOLEDB','seattle1';'sa';'MyPass',
   'SELECT * FROM pubs.dbo.authors ORDER BY au_lname, au_fname') AS a
GO
B. 将 OPENROWSET 与对象及用于 ODBC 的 OLE DB 提供程序一起使用

下面的示例使用用于 ODBC 的 OLE DB 提供程序以及 SQL Server ODBC 驱动程序访问 pubs 数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器中。提供程序用在 ODBC 提供程序所用的 ODBC 语法中指定的 provider_string 进行初始化,定义返回的行集时使用 catalog.schema.object 语法。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('MSDASQL',
   'DRIVER={SQL Server};SERVER=seattle1;UID=sa;PWD=MyPass',
   pubs.dbo.authors) AS a
ORDER BY a.au_lname, a.au_fname
GO
C. 使用用于 Jet 的 Microsoft OLE DB 提供程序

下面的示例通过用于 Jet 的 Microsoft OLE DB 提供程序访问 Microsoft Access Northwind 数据库中的 orders 表。

<!--NOTE-->

说明下面的示例假定已经安装了 Access。

<!--/NOTE-->

USE pubs
GO
SELECT a.*
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
   'c:/MSOffice/Access/Samples/northwind.mdb';'admin';'mypwd', Orders) 
   AS a
GO
D. 使用 OPENROWSET 和 INNER JOIN 中的另一个表

下面的示例从本地 SQL Server Northwind 数据库的 customers 表中,以及存储在相同计算机上 Access Northwind 数据库的 orders 表中选择所有数据

<!--NOTE-->

说明下面的示例假定已经安装了 Access。

<!--/NOTE-->

USE pubs
GO
SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c INNER JOIN 
   OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
   'c:/MSOffice/Access/Samples/northwind.mdb';'admin';'mypwd', Orders) 
   AS o
   ON c.CustomerID = o.CustomerID 
GO

用于 Jet 的 Microsoft OLE DB 提供程序

用于 Jet 的 Microsoft® OLE DB 提供程序为 Microsoft Access 数据库提供了 OLE DB 接口,并且使 Microsoft SQL Server™ 2000 分布式查询得以查询 Access 数据库。

创建链接服务器以访问 Access 数据库

  1. 执行 sp_addlinkedserver 来创建链接服务器,指定 Microsoft.Jet.OLEDB.4.0 作为 provider_name,指定 Access .mdb 数据库文件的完整路径名作为 data_source。.mdb 数据库文件必须驻留在服务器上,data_source 在服务器上而不是在客户机上进行评估,路径必须是服务器上的有效路径。

    例如,若要创建一个名为 Nwind 的链接服务器,对 C:/Mydata directory 目录中名为 Nwind.mdb 的 Access 数据库进行操作,请执行:

    sp_addlinkedserver 'Nwind', 'Access 97', 'Microsoft.Jet.OLEDB.4.0', 
        'c:/mydata/Nwind.mdb'
    
  2. 为访问非保密的 Access 数据库,试图访问 Access 数据库的 SQL Server 登录应该有一个为用户名 Admin 定义的没有密码的登录映射。

    下例使得本地用户 Joe 可以访问名为 Nwind 的链接服务器。

    sp_addlinkedsrvlogin 'Nwind', false, 'Joe', 'Admin', NULL
    

    要访问保密的 Access 数据库,需使用注册表编辑器配置注册表,以便使用 Access 所用的正确的工作组信息文件。使用注册表编辑器向该注册表项中添加 Access 使用的工作组信息文件的完整路径名称:

    HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/SystemDB
    

    配置了注册表项后,请使用 sp_addlinkedsrvlogin 创建从本地登录到 Access 登录的登录映射:

    sp_addlinkedsrvlogin 'Nwind', false, 'Joe',
                            'AccessUser', 'AccessPwd'
    

Access 数据库没有目录和架构名称。因此,基于 Access 的链接服务器中的表可以在分布式查询中使用表单 linked_server...table_name 的四部分名称进行引用。

下例从名为 Nwind 的链接服务器中检索 Employees 表的所有行。

SELECT * 
FROM Nwind...Employees

创建链接服务器以访问 Excel 电子表格

用于 Jet 4.0 的 Microsoft OLE DB 提供程序可用于访问 Microsoft Excel 电子表格。

  • 若要创建访问 Excel 电子表格的链接服务器,请使用下例中的格式。
    sp_addlinkedserver N'Excel', N'Jet 4.0',
                       N'Microsoft.Jet.OLEDB.4.0',
                       N'c:/data/MySheet.xls', NULL, N'Excel 5.0'
    GO
    sp_addlinkedsrvlogin N'Excel', false, sa, N'ADMIN', NULL
    GO
    
  • 若要访问 Excel 电子表格中的数据,请将单元范围与名称相关联。可以通过将范围名称用作表名来访问命名范围。通过使用在上例中设置的链接服务器,下面的查询可用于访问称为 SalesData 的命名范围。
    SELECT *
    FROM EXCEL...SalesData
    GO
    

    将某行插入命名单元范围时,该行将添加到命名单元范围的最后一行之后。因此,如果想在列标题后插入行 rA,则将列标题单元与某个名称关联并使用该名称作为表名。当插入行时,单元范围将自动增长。

设置链接服务器以访问格式化文本文件

用于 Jet 的 Microsoft OLE DB 提供程序可用于访问并查询文本文件。

  • 若要直接创建访问文本文件的链接服务器而不将文件链接为 Access .mdb 文件中的表,请执行 sp_addlinkedserver,如下例所示。

    提供程序是 Microsoft.Jet.OLEDB.4.0,提供程序字符串为"Text"。数据源是包含文本文件的目录的完整路径名称。schema.ini 文件(描述文本文件的结构)必须与此文本文件存在于相同的目录中。有关创建 schema.ini 文件的更多信息,请参见 Jet 数据库引擎文档。

    --Create a linked server.
    EXEC sp_addlinkedserver txtsrv, 'Jet 4.0', 
        'Microsoft.Jet.OLEDB.4.0',
        'c:/data/distqry',
        NULL,
        'Text'
    GO
    
    --Set up login mappings.
    EXEC sp_addlinkedsrvlogin txtsrv, FALSE, NULL, Admin, NULL
    GO
    
    --List the tables in the linked server.
    EXEC sp_tables_ex txtsrv
    GO
    
    --Query one of the tables: file1#txt
    --using a 4-part name. 
    SELECT * 
    FROM txtsrv...[file1#txt]
    
<!--END-->

你可能感兴趣的:(Excel)