OPENROWSET (Transact-SQL)

适用于: SQL Server 2016 (13.x) 及更高版本

OPENROWSET 是访问链接服务器中的表的替代方法,是连接和访问远程数据的一次性临时方法。 OPENROWSET T-SQL 命令包括从外部数据源访问远程数据所需的所有连接信息。

OPENROWSET可以在查询的子句中FROM引用该函数,就好像它是表名一样。 OPENROWSET还可以将函数引用为受数据提供程序功能约束的 、UPDATEDELETE语句的目标表INSERT。 尽管查询可能返回多个结果集,但 OPENROWSET 只返回第一个结果集。

小窍门

若要更频繁地引用外部数据源,请改用链接服务器。 有关详细信息,请参阅链接服务器(数据库引擎)

OPENROWSET BULK不带运算符的 SQL Server 仅在 SQL Server 上可用。 其他平台上类似示例的详细信息和链接:

Transact-SQL 语法约定

语法

OPENROWSET 语法用于查询外部数据源:

OPENROWSET
(  'provider_name'
    , { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }
    , {  [ catalog. ] [ schema. ] object | 'query' }
)

参数

provider_name

一个字符串,表示注册表中指定的数据提供程序的友好名称(或 PROGID)。 provider_name 没有默认值 。 提供程序名称示例是 MSOLEDBSQLMicrosoft.Jet.OLEDB.4.0MSDASQL

datasource

对应于特定数据源的字符串常量。 数据源DBPROP_INIT_DATASOURCE 要传递给 IDBProperties 提供程序接口以初始化提供程序的属性。 通常,此字符串包括数据库文件的名称、数据库服务器的名称或提供程序了解用于查找数据库或数据库的名称。

数据源可以是 C:\SAMPLES\Northwind.mdb' 提供程序的文件路径 Microsoft.Jet.OLEDB.4.0,也可以是 Server=Seattle1;Trusted_Connection=yes; 提供程序的连接字符串 MSOLEDBSQL

user_id

一个字符串常量,该常量是传递给指定数据提供程序的用户名。 user_id指定连接的安全上下文,并作为DBPROP_AUTH_USERID属性传入以初始化提供程序。 user_id不能是 windows 登录名Microsoft。

password

一个字符串常量,该常量是要传递给数据提供程序的用户密码。 初始化提供程序时,密码 作为属性传入 DBPROP_AUTH_PASSWORD密码 不能Microsoft Windows 密码。 例如:

SELECT a.* FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\SAMPLES\Northwind.mdb';
    '<user name>';
    '<password>',
    Customers
) AS a;

provider_string

作为属性传入DBPROP_INIT_PROVIDERSTRING的特定于提供程序的连接字符串,用于初始化 OLE DB 访问接口。 provider_string 通常封装初始化提供程序所需的所有连接信息 。

有关 SQL Server Native Client OLE DB 访问接口识别的关键字列表,请参阅初始化和授权属性(Native Client OLE DB Provider)。 已从 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中移除 SQL Server Native Client(通常缩写为 SNAC)。 不建议在新的开发工作中使用 SQL Server Native Client OLE DB 提供程序(SQLNCLI 或 SQLNCLI11)和旧版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。 此后请切换到新的 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server

SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    Department
) AS d;

[ 目录。 ] [ 架构。 ] 对象

包含 OPENROWSET 应读取的数据的远程表或视图。 它可以是包含以下组件的三部分名称对象:

  • catalog(可选)- 指定对象所在的目录或数据库的名称 。
  • schema(可选)- 架构名称或指定对象的对象所有者名称 。
  • object - 对象名称,唯一地标识出将要操作的对象 。
SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    AdventureWorks2022.HumanResources.Department
) AS d;

query

发送到提供程序和执行的字符串常量。 SQL Server 的本地实例不处理此查询,但处理提供程序返回的查询结果(传递查询)。 传递查询在提供程序上使用时非常有用,这些提供程序不通过表名提供其表格数据,而只能通过命令语言使用。 只要查询提供程序支持 OLE DB Command 对象及其强制接口,那么在远程服务器上就支持传递查询。

有关详细信息,请参阅 SQL Server Native Client (OLE DB) 接口

SELECT a.*
FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT TOP 10 GroupName, Name FROM AdventureWorks2022.HumanResources.Department'
) AS a;

注解

仅当 DisallowAdhocAccess 注册表选项针对指定的提供程序显式设置为 0,并且启用 Ad Hoc Distributed Queries 高级配置选项时,OPENROWSET 才可用于访问 OLE DB 数据源中的远程数据 。 如果未设置这些选项,则默认行为不允许临时访问。

访问远程 OLE DB 数据源时,不会从客户端连接到正在查询的服务器自动委派受信任连接的登录标识。 必须配置身份验证委托。

如果数据提供程序支持指定数据源中的多个目录和架构,则需要目录和架构名称。 catalog schema当数据提供程序不支持这些值时,可以省略这些值。 如果提供程序仅支持架构名称,则必须指定窗体 schema.object 的两部分名称。 如果提供程序仅支持目录名称,则必须指定表单 catalog.schema.object 的三部分名称。 有关详细信息,请参阅 Transact-SQL 语法约定

使用 SQL Server Native Client OLE DB 访问接口的传递查询需要三部分名称。

OPENROWSET 不接受其参数的变量。

OPENDATASOURCE 子句中对 OPENQUERYOPENROWSETFROM 的任何调用与对用作更新目标的这些函数的任何调用都是分开独立计算的,即使为两个调用提供的参数相同也是如此。 具体而言,应用到上述任一调用的结果的筛选器或联接条件不会影响其他调用的结果。

权限

OPENROWSET 权限由传递给数据提供程序的用户名的权限确定。

示例

本部分提供一般示例,演示如何使用 OPENROWSET。

注意

有关显示使用 INSERT...SELECT * FROM OPENROWSET(BULK...)的示例,请参阅 OPENROWSET BULK (Transact-SQL)

已从 SQL Server 2022 (16.x) 和 SQL Server Management Studio 19 (SSMS) 中移除 SQL Server Native Client(通常缩写为 SNAC)。 不建议在新的开发工作中使用 SQL Server Native Client OLE DB 提供程序(SQLNCLI 或 SQLNCLI11)和旧版 Microsoft OLE DB Provider for SQL Server (SQLOLEDB)。 此后请切换到新的 Microsoft OLE DB Driver (MSOLEDBSQL) for SQL Server

答: 将 OPENROWSET 与 SELECT 和 SQL Server Native Client OLE DB 提供程序配合使用

以下示例使用 SQL Server Native Client OLE DB 提供程序访问 HumanResources.Department 表,该表位于远程服务器 AdventureWorks2022 上的 Seattle1 数据库中。 (用于 MSOLEDBSQL 取代 SQLNCLI的新式 Microsoft SQL Server OLE DB 数据提供程序。语句 SELECT 用于定义返回的行集。 访问接口字符串包含 ServerTrusted_Connection 关键字。 这些关键字由 SQL Server Native Client OLE DB 提供程序识别。

SELECT a.*
FROM OPENROWSET(
    'MSOLEDBSQL', 'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT GroupName, Name, DepartmentID
         FROM AdventureWorks2022.HumanResources.Department
         ORDER BY GroupName, Name'
) AS a;

B. 使用适用于 Jet 的 Microsoft OLE DB 提供程序

以下示例通过 Microsoft OLE DB Provider for Jet 访问 Microsoft Access Customers 数据库中的 Northwind 表。

注意

此示例假定已安装 Microsoft Access。 若要运行此示例,必须安装 Northwind 数据库。

SELECT CustomerID, CompanyName
FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
    'admin';'',
    Customers
);

°C 使用 INNER JOIN 中的 OPENROWSET 和另一个表

以下示例从 SQL Server Northwind 数据库的本地实例中选择表中的所有数据Customers,并从Orders存储在同一台计算机上的 Microsoft Access Northwind 数据库的表中选择所有数据。

注意

此示例假定已安装 Microsoft Access。 若要运行此示例,必须安装 Northwind 数据库。

USE Northwind;
GO

SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c
INNER JOIN OPENROWSET(
        'Microsoft.Jet.OLEDB.4.0',
        'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'',
        Orders) AS o
    ON c.CustomerID = o.CustomerID;