访问外部数据

若要访问 OLE DB 数据源中的数据,必须向 SQL Server 提供以下信息:

  • 公开数据源的 OLE DB 访问接口的名称。

  • OLE DB 访问接口定位数据源所需的所有信息。

  • OLE DB 数据源可将其公开为行集的对象名称,或可发送到(会导致数据源公开行集的)OLE DB 访问接口的查询。能够作为行集公开的对象称为远程表。能够生成行集的查询称为传递查询。

  • 或者,也可以向 SQL Server 提供 OLE DB 数据源的有效登录 ID。

SQL Server 通过使用链接服务器名称或特殊计算机名称,支持在 Transact-SQL 语句中引用异类 OLE DB 数据源。

链接服务器名称

链接服务器是已定义到 SQL Server 的虚拟服务器,其中包含了访问 OLE DB 数据源所需的全部信息。链接服务器名称使用 sp_addlinkedserver 系统存储过程定义。链接服务器定义包含定位 OLE DB 数据源所需的全部信息。本地 SQL Server 登录通过使用 sp_addlinkedsrvlogin 映射到链接服务器中的登录。

远程表可以按照以下情形之一,使用链接服务器名称来引用:

  • 四部分名称表中的服务器名称或 Transact-SQL 语句中的视图引用。该名称的其他三部分可引用公开为行集的链接服务器中的对象。

  • OPENQUERY 函数的输入参数。OPENQUERY 函数向 OLE DB 访问接口发送要执行的命令。然后,返回的行集可以在 Transact-SQL 语句中用作表或视图引用。

有关详细信息,请参阅使用链接服务器名称标识数据源

临时名称

临时名称针对未定义为链接服务器的 OLE DB 数据源,用于不常用的查询。在 SQL Server 中,OPENROWSET 和 OPENDATASOURCE 函数提供了用于访问 OLE DB 数据源中的数据的连接信息。

默认情况下,不支持临时名称。DisallowAdhocAccess 访问接口选项必须设置为 0,同时必须启用“临时分布式查询”高级配置选项。

安全说明安全说明

允许使用临时名称意味着到 SQL Server 的任何经过身份验证的登录名均可访问该访问接口。SQL Server 管理员应仅为任何本地登录名可安全访问的高度可信的访问接口启用此功能。

OPENROWSET 和 OPENDATASOURCE 只应在引用不常访问的 OLE DB 数据源时使用。对于将要经常访问的数据源,应定义链接服务器。OPENDATASOURCE 和 OPENROWSET 都未提供链接服务器定义的所有功能。这包括用于查询目录信息的安全管理和功能。每次调用这些函数时,都必须提供所有连接信息(包括密码)。

OPENROWSET 和 OPENDATASOURCE 显示为函数,并且为方便起见作为函数引用;但是,OPENROWSET 和 OPENDATASOURCE 是宏并且不支持将 Transact-SQL 变量作为参数。

OPENROWSET 可在返回行集的任何 OLE DB 访问接口中使用,并且可以在 Transact-SQL 语句中使用表或视图引用的任何位置使用。OPENROWSET 可使用以下内容来指定:

  • 连接到 OLE DB 数据源所需的全部信息。

  • 将要生成行集的对象名称或查询。

OPENDATASOURCE 提供的连接信息将作为四部分对象名称中的一部分。此函数仅支持使用 catalog**.schema.**object 批注公开多个行集的 OLE DB 访问接口。在可以使用链接服务器名称的 Transact-SQL 语法中,OPENDATASOURCE 可以在相同的位置上使用。OPENDATASOURCE 可使用以下内容指定:

  • 注册为用于访问数据源的 OLE DB 访问接口的 PROGID 的名称。

  • 连接字符串,用于指定要传递到 OLE DB 访问接口的各种连接属性。连接字符串的语法是关键字/值对的序列。其基本语法在 Microsoft 数据访问软件开发工具包中定义,并且每个访问接口都记录了所支持的特定关键字/值对。有关使用连接字符串的详细信息,请参阅 OPENDATASOURCE (Transact-SQL)

有关详细信息,请参阅使用临时名称标识数据源

访问链接服务器

使用 sp_addlinkedserver 创建链接服务器后,可以使用下列方法对其进行访问:

  • 使用基于链接服务器的名称,通过 SELECT、INSERT、UPDATE 和 DELETE 语句访问链接服务器中的表的分布式查询。

  • 使用四部分名称对链接服务器执行远程存储过程。

  • EXECUTE 语句通过使用 AT linked_server_name 扩展插件来执行任意参数化传递命令。此命令包括数据定义语言 (DDL) 和数据操作语言 (DML) 语句,或返回多个结果的命令。有关详细信息,请参阅将传递查询用作表

sp_addserver 是为兼容现有应用程序而保留的功能,但是在未来的版本中将不支持此存储过程。随着应用程序导出到 SQL Server 2008,这些应用程序可能需要在一段时间内,运行一些针对链接服务器定义使用分布式查询的新代码,和一些使用远程服务器定义的旧代码。链接服务器和远程服务器使用的是相同的命名空间。因此,链接服务器或远程服务器定义都必须使用不同于正被远程访问的服务器的网络名称的名称。使用不同的服务器名称定义一个条目,然后使用 sp_setnetname 将其与远程服务器的网络名称关联起来。