适用于: SQL Server 2016 (13.x) 及更高版本
OPENROWSET
是访问链接服务器中的表的替代方法,是连接和访问远程数据的一次性临时方法。
OPENROWSET
T-SQL 命令包括从外部数据源访问远程数据所需的所有连接信息。
OPENROWSET
可以在查询的子句中FROM
引用该函数,就好像它是表名一样。
OPENROWSET
还可以将函数引用为受数据提供程序功能约束的 、UPDATE
或DELETE
语句的目标表INSERT
。 尽管查询可能返回多个结果集,但 OPENROWSET
只返回第一个结果集。
小窍门
若要更频繁地引用外部数据源,请改用链接服务器。 有关详细信息,请参阅链接服务器(数据库引擎)。
OPENROWSET
BULK
不带运算符的 SQL Server 仅在 SQL Server 上可用。 其他平台上类似示例的详细信息和链接:
-
OPENROWSET
支持通过许多数据库引擎平台上的内置BULK
提供程序(包括 Azure 和 Microsoft Fabric)执行批量作。 有关详细信息,请参阅 OPENROWSET BULK (Transact-SQL)。 - 有关Azure SQL 托管实例的示例,请参阅使用 OPENROWSET 查询数据源。
- Azure SQL 数据库仅支持 OPENROWSET BULK(Transact-SQL)。
- 有关 Azure Synapse 中无服务器 SQL 池的信息和示例,请参阅 如何在 Azure Synapse Analytics 中使用无服务器 SQL 池使用 OPENROWSET。 Azure Synapse 中的专用 SQL 池不支持该
OPENROWSET
函数。
语法
OPENROWSET
语法用于查询外部数据源:
OPENROWSET
( 'provider_name'
, { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }
, { [ catalog. ] [ schema. ] object | 'query' }
)
参数
“provider_name”
一个字符串,表示注册表中指定的数据提供程序的友好名称(或 PROGID
)。 provider_name 没有默认值 。 提供程序名称示例是 MSOLEDBSQL
、Microsoft.Jet.OLEDB.4.0
或 MSDASQL
。
“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
子句中对 OPENQUERY
、OPENROWSET
或 FROM
的任何调用与对用作更新目标的这些函数的任何调用都是分开独立计算的,即使为两个调用提供的参数相同也是如此。 具体而言,应用到上述任一调用的结果的筛选器或联接条件不会影响其他调用的结果。
权限
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
用于定义返回的行集。 访问接口字符串包含 Server
和 Trusted_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;