行集函数:OpenRowSet 和 OpenQuery

简介:

在SQL Server中,行集函数是不确定性的,这意味着,每次调用,返回值不总是相同的。返回值是不确定的,这意味着,对于相同的输入值,不保证每次返回的值都是相同的。对行集函数的每次调用,行集函数都是单独计算。行集函数:OpenRowSet 和 OpenQuery 的行为和Base Table相似:

  • 能够用于From子句,就像行集函数是一个Base Table,从行集函数中获取数据;
  • 能够用于修改数据,修改命令(INSERT, UPDATE, or DELETE)直接作用于行集函数,对Base Table进行数据修改;

行集函数:OpenRowSet 语法

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

‘Provider_name’ 参数:本文主要从SQL Server和Excel中访问数据,提供程序的名字分别是:SQLNCLI 和 Microsoft.ACE.OLEDB.12.0(处理 .xlsx文件);

'query' 参数:指定一个穿透查询(Pass-Through Query)字符串,本地的SQL Server实例不会处理该查询,在提供程序(Provider)中执行,并返回查询的结果;

一,默认情况下,OpenRowSet 是Disable状态

OpenRowSet函数能够用于从OLEDB数据源访问远程数据的条件是:

  • 对于指定提供程序(Provider),DisallowAdhocAccess 注册表选项显式设置为0;
  • 启用 Ad Hoc Distributed Queries 高级选项,在SQL Server中,该选项默认是Disable的,需要显式启用(Enable);

OPENROWSET can be used to access remote data from OLE DB data sources only when the DisallowAdhocAccess registry option is explicitly set to 0 for the specified provider, and the Ad Hoc Distributed Queries advanced configuration option is enabled. When these options are not set, the default behavior does not allow for ad hoc access.

在SQL Server中启用 “Ad Hoc Distributed Queries” 高级选项的脚本是:

复制代码
-- enable
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec  sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO
--disable
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec  sp_configure 'Ad Hoc Distributed Queries', 0;
RECONFIGURE;
GO
复制代码

如果没有启用“Ad Hoc Distributed Queries” 高级选项,在执行OpenRowSet函数时,SQL Server会抛出错误信息:

SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. For more information about enabling 'Ad Hoc Distributed Queries', search for 'Ad Hoc Distributed Queries' in SQL Server Books Online.

二,从SQL Server 中获取数据,'provider_name' 参数是 SQLNCLI .

1,使用OpenRowSet 执行 sql 查询语句,查询语句被发送到指定的Server上执行,将结果集返回到OpenRowSet 函数中。Query Statement 使用 Three-Part命名规则,即 Database_Name.Schema_Name.Table_Name。

复制代码
select *
FROM OPENROWSET(
    'SQLNCLI', 
    'Server=Server_Name;Trusted_Connection=yes;',
    'select * from db_study.dbo.test'  --query statement
) AS t;
复制代码

2,OpenRowSet 能够在query 子句中,使用 exec 执行存储过程,返回结果集

复制代码
SELECT *
FROM OPENROWSET(
    'SQLNCLI', 
    'Server=Server_Name;Trusted_Connection=yes;',
    'exec db_study.[dbo].[usp_test]'  --query statement
) AS t;
复制代码

三,从Excel中读取数据,把Excel作为数据源

从Excel中读取数据,'provider_name' 是Excel处理引擎的名字,主要有两个版本:

  • 'Microsoft.Jet.OLEDB.4.0' :用于处理xls文件
  • 'Microsoft.ACE.OLEDB.12.0':用于处理xlsx文件,用于从Microsoft Office Excel 2007中访问数据

1,注册'Microsoft.ACE.OLEDB.12.0'引擎

查看SQL Server 可用的Providers,依次点击 Server Objects-》Linked Servers-》Providers,如果存在Microsoft.ACE.OLEDB.12.0 或 Microsoft.ACE.OLEDB.16.0,说明ACE.OLEDB 引擎已经注册到系统中,在SQL Server能够执行OpenRowSet函数处理xlsx数据。

如果没有注册 'Microsoft.ACE.OLEDB.12.0'引擎,在从Excel中读取数据时,SQL Server会报错:The OLE DB provider "Microsoft.ACE.OLEDB.12.0" has not been registered.

注册ACE OLE DB处理引擎的过程十分简单,从微软的官方站点下载:Microsoft Access Database Engine 2010 Redistributable,在安装驱动程序时,需要匹配机器的系统类型,如果安装的是是64位操作系统,请安装:AccessDatabaseEngine_X64.exe,如果遇到:未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序的错误,首先检查系统是否安装Excel数据库引擎,然后检查Excel数据引擎是否和本地的操作系统兼容,请在64位的机器上安装64位版本的Excel数据库引擎。

2,配置Excel引擎

在安装Excel处理引擎之后,在SQL Server中,需要配置AllowInProcess 和 DynamicParameters两个选项,否则SQL Server会抛出错误信息:

OLE DB provider 'Microsoft.ACE.OLEDB.12.0' cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode.”

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1 

3,使用OpenRowSet从Excel中查询数据

使用OpenRowSet从Excel中读取数据,有两种格式:使用查询语句,使用sheet name,例如:

复制代码
select * 
from OpenRowSet(
    'Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\test.xlsx', 
    'select * from [sheet1$]'
) 
--or 
select * 
from OpenRowSet
(
    'Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;HDR=Yes;IMEX=1;Database=D:\test.xlsx', 
    [sheet1$]
) 
复制代码

4,故障排除

在使用OpenRowSet时,经常会遇到以下错误消息:

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Unspecified error".

Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

这两种情况是由于权限不够导致,使用sa账号登陆,赋予sysadmin 权限即可;

引用《Using OPENROWSET instead of a Linked Server

Windows Authentication            

select a.* from openrowset('SQLNCLI', 'Server=MYINSTANCE;Trusted_Connection=yes;', 'select * from sys.databases') as a

SQL Server Authentication

select a.* from openrowset('SQLNCLI', 'Server=MYINSTANCE;UID=mySQLUser; PWD=*******;', 'select * from sys.databases') as a

行集函数:OpenQuery  语法

OpenQuery在特定的Linked Server上执行穿透查询,即,OpenQuery函数将查询语句发送到Remote Server上运行,然后返回查询结果,大幅提高了Linked Server的查询性能。(Executes the specified pass-through query on the specified linked server.) 

OPENQUERY ( linked_server ,'query' )

1,Executing an UPDATE pass-through query

UPDATE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE id = 101') 
SET name = 'ADifferentName';

2,Executing an INSERT pass-through query

INSERT OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles')
VALUES ('NewTitle');

3,Executing a DELETE pass-through query

DELETE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE name = ''NewTitle''');

 

参考doc:

OPENROWSET (Transact-SQL) 

Excel Import to SQL Server using Distributed Queries

MS SQL SERVER READ EXCEL FILE (EXCEL 2010, 2013) - OPENROWSET (x64) - (T-SQL)

OPENQUERY (Transact-SQL)

Top 3 Performance Killers For Linked Server Queries

作者悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
分类: SQL Server





本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/4549180.html,如需转载请自行联系原作者
目录
相关文章
|
关系型数据库 PostgreSQL
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
PostgreSQL 计算字符串字符数函数(CHAR_LENGTH(str))和字符串长度函数(LENGTH(str))
3789 0
|
SQL 安全 Oracle
SQL Server 链接服务器(Linked Servers)
【9月更文挑战第12天】SQL Server 的链接服务器功能强大,可让你在一个实例中访问其他数据源,包括其他 SQL Server 实例、Oracle 数据库等。它支持数据集成、分布式查询和数据同步,无需复制数据。创建链接服务器需在 SQL Server Management Studio 中进行,并配置名称、类型及安全性。使用时需注意权限、性能和安全性问题,确保系统稳定和数据安全。
999 0
|
运维 监控 安全
2024除了宝塔面板还有哪些好用的服务器管理软件
2024年,服务器管理软件市场百花齐放,本文介绍Websoft9、cPanel和Orion-Ops三款软件,分别在开源应用部署、Web主机管理和自动化运维方面表现出色,为用户提供更多选择。
|
消息中间件 JSON 监控
Kafka 的消息格式:了解消息结构与序列化
Kafka 作为一款高性能的消息中间件系统,其消息格式对于消息的生产、传输和消费起着至关重要的作用。本篇博客将深入讨论 Kafka 的消息格式,包括消息的结构、序列化与反序列化,以及一些常用的消息格式选项。通过更丰富的示例代码和深入的解析,希望能够帮助大家更好地理解 Kafka 消息的内部机制。
|
敏捷开发 测试技术 持续交付
Python 的软件开发实践:解释什么是敏捷开发和持续集成(Continuous Integration)?
Python 的软件开发实践:解释什么是敏捷开发和持续集成(Continuous Integration)?
241 0
|
敏捷开发 开发框架 架构师
敏捷开发发展和优缺点 1
敏捷开发发展和优缺点
904 0
|
SQL Serverless 数据库
|
算法 Java
红黑树,超强动静图详解,简单易懂
红黑树,超强动静图详解,简单易懂
红黑树,超强动静图详解,简单易懂
|
SQL 缓存 数据库
阿里云SQL Server最佳实践:高CPU使用率问题排查
在阿里云SQL Server最佳实践系列在线直播中,阿里云数据库专家汪建明总结了7大问题并结合案例为大家分享了阿里云SQL Server高CPU使用率问题排查的实践经验。
11662 0
|
数据库连接 数据库 Windows
Microsoft OLE DB Provider for ODBC 组件
Microsoft OLE DB Provider for ODBC (MSDASQL) 一项允许在 OLEDB 和 ADO(它在内部使用 OLEDB)上构建的应用程序通过 ODBC 驱动程序访问数据源的技术。
1555 1