OPENDATASOURCE (Transact-SQL)

适用于:SQL ServerAzure SQL 托管实例

在四部分对象名称中提供连接信息,而不使用链接服务器名称。

Transact-SQL 语法约定

语法

OPENDATASOURCE ( 'provider_name', 'init_string' )  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

'provider_name'

注册为用于访问数据源的 OLE DB 访问接口的 PROGID 的名称。 provider_name 的数据类型为 char,并且没有默认值

重要

已从 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

'init_string'

连接字符串,该字符串将要传递给目标提供程序的 IDataInitialize 接口。 提供程序字符串语法是以关键字值对为基础的,这些关键字值对由分号隔开,例如:“keyword1=value;keyword2=value”

若要了解提供程序上支持的特定关键字值对,请参阅 Microsoft Data Access SDK。 该文档定义了基本语法。 下表列出了 init_string 参数中最常用的关键字

关键字 OLE DB 属性 有效值和说明
数据源 DBPROP_INIT_DATASOURCE 要连接的数据源的名称。 不同的提供程序用不同的方法对此进行解释。 对于 SQL Server Native Client OLE DB 访问接口,这指示服务器的名称。 对于 Jet OLE DB 访问接口来说,这指示 .mdb 文件或 .xls 文件的完整路径。
位置 DBPROP_INIT_LOCATION 要连接的数据库的位置。
扩展属性 DBPROP_INIT_PROVIDERSTRING 提供程序特定的连接字符串。
连接超时 DBPROP_INIT_TIMEOUT 达到此超时值后,连接尝试就会失败。
用户 ID DBPROP_AUTH_USERID 用于该连接的用户 ID。
密码 DBPROP_AUTH_PASSWORD 用于该连接的密码。
目录 DBPROP_INIT_CATALOG 连接到数据源时的初始或默认的目录名称。
集成安全性 DBPROP_AUTH_INTEGRATED SSPI,指定 Windows 身份验证

注解

OPENROWSET 始终继承实例排序规则,而不考虑列的排序规则集。

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

OPENDATASOURCE 函数可以在与链接服务器名称相同的 Transact-SQL 语法位置中使用。 因此,可以将 OPENDATASOURCE 用作四部分名称的第一部分,该部分名称引用 SELECT、INSERT、UPDATE 或 DELETE 语句中的表或视图的名称;或者引用 EXECUTE 语句中的远程存储过程。 当执行远程存储过程时,OPENDATASOURCE 应该引用 SQL Server 的另一个实例。 OPENDATASOURCE 不接受参数变量。

OPENROWSET 函数类似,OPENDATASOURCE 应该只引用那些不经常访问的 OLE DB 数据源。 对于访问次数较频繁的任何数据源,请为它们定义链接服务器。 无论 OPENDATASOURCE,还是 OPENROWSET,都不能提供链接服务器定义的全部功能,如安全管理以及目录信息查询功能。 每次调用 OPENDATASOURCE 时,都必须提供所有的连接信息(包括密码)。

重要

Windows 身份验证比 SQL Server 身份验证要安全得多。 应尽量使用 Windows 身份验证。 OPENDATASOURCE 不应该用于连接字符串中的显式密码。

每个提供程序的连接要求与创建链接服务器时的参数要求相似。 sp_addlinkedserver (Transact-SQL) 一文中列出了众多常见提供程序的详细信息。

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

权限

任何用户都可以执行 OPENDATASOURCE。 用于连接到远程服务器的权限由连接字符串确定。

示例

A. 将 OPENDATASOURCE 与 SELECT 和 SQL Server OLE DB 驱动程序配合使用

以下示例使用 Microsoft OLE DB Driver for SQL Server 访问远程服务器 Seattle1AdventureWorks2022 数据库中的 HumanResources.Department 表。 使用 SELECT 语句定义返回的行集。 访问接口字符串包含 ServerTrusted_Connection 关键字。 这些关键字由 SQL Server OLE DB 驱动程序识别。

SELECT GroupName, Name, DepartmentID  
FROM OPENDATASOURCE('MSOLEDBSQL', 'Server=Seattle1;Database=AdventureWorks2022;TrustServerCertificate=Yes;Trusted_Connection=Yes;').HumanResources.Department  
ORDER BY GroupName, Name;  

B. 将 OPENDATASOURCE 与 SELECT 和 SQL Server OLE DB 提供程序配合使用

以下示例将创建与服务器 Payroll 上的 SQL Server 实例 London 的即席连接,并查询 AdventureWorks2022.HumanResources.Employee 表。

注意

使用 SQLNCLI 会将 SQL Server 重定向至 SQL Server Native Client OLE DB 提供程序的最新版本。 OLE DB 提供程序应以指定的 PROGID 在注册表中注册。

重要

SQL Server Native Client OLE DB 提供程序 (SQLNCLI) 仍然不推荐使用,不建议在新的开发工作中使用它。 相反,请使用新的 Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL),其将使用最新的服务器功能进行更新。

SELECT *  
FROM OPENDATASOURCE('SQLNCLI',  
    'Data Source=London\Payroll;Integrated Security=SSPI')  
    .AdventureWorks2022.HumanResources.Employee;  

C. 使用 Microsoft OLE DB Provider for Jet

以下示例以 1997 - 2003 格式创建与 Excel 电子表格的即席连接。

SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',  
    'Data Source=C:\DataFolder\Documents\TestExcel.xls;Extended Properties=EXCEL 5.0')...[Sheet1$] ;  

后续步骤