OPENROWSET

本文介绍了如何使用SQL Server中的OPENROWSET和OpenDataSource函数来实现跨数据库查询,包括从Excel和Access文件中读取数据的方法,以及不同场景下的具体应用案例。

--汇总的OPENROWSET,OpenDataSource

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=C:/account.xls', ' SELECT * FROM  [sheet1$]')

 -- 从Excel取数据
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=c:/account.xls',[Sheet1$])

 

SELECT a.*
FROM OPENROWSET('SQLOLEDB','tao';'sa';'','SELECT * FROM pubs.dbo.authors ORDER BY au_lname, au_fname') AS a

 

SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0','Data Source="c:/account.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...Sheet1$
 

 --ODBC 的OLE DB 提供程序
SELECT a.* FROM table1 a LEFT JOIN OPENROWSET('MSDASQL','DRIVER={SQL Server};SERVER=192.168.0.1,2412;UID=sa;PWD=',DbName.dbo.table2) AS b ON a.id = b.id ORDER BY a.ID DESC
--将地址为192.168.0.1端口为2412的SQL SERVER上的table2表和本地服务器上的table1表联接。

SELECT * FROM (SELECT a.* FROM table1 a UNION SELECT b.* FROM OPENROWSET('MSDASQL','DRIVER={SQL Server};SERVER=192.168.0.1,2412;UID=aa;PWD=bb',DbName.dbo.table2) AS b) TempTable ORDER BY ID DESC
--将地址为192.168.0.1端口为2412的SQL SERVER上的table2表中内容加到table1表中。

--使用SQL Server 的 Microsoft OLE DB:

OPENROWSET('SQLOLEDB','服务器地址,端口';'用户名';'密码', 'SQL语句')

--使用Jet 的 Microsoft OLE DB:
OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'c:/test.mdb';'admin';'pwd', Orders)

--注意:以上两种用户名和密码前都是用分号分隔。
select * from OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'c:/test.mdb';'admin';'', Orders)
select * from OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'c:/test.mdb';'admin';'','select * from  Orders')
select * from OpenDataSource('Microsoft.Jet.oledb.4.0','c:/Test.mdb;UserID=admin;Password=;Extended properties=Access')...Orders

 

insert into OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:/Temp.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...Sheet1$ (A1,A2)   values (1,2)
--注:A1,A2,A3 为自己在Excel文档中添加的列名,而不是Excel 默认的 A,B,C,D等 

insert into OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:/Temp.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...Sheet1$  SELECT  ID FROM CUSTOMER 

<think>好的,我需要帮助用户了解如何在 SQL Server 中使用 OPENROWSET 功能。首先,我得回忆一下 OPENROWSET 的作用和常见用法。根据用户提供的引用内容,OPENROWSET 主要用于在 SQL Server 中访问远程数据库,可以执行查询或直接读取数据。 接下来,我应该整理使用步骤。根据引用[1]和[4],OPENROWSET 有两种常见形式:连接其他数据库(如MySQL)和连接另一台SQL Server实例。需要分点说明,并给出示例。例如,连接到MySQL可能需要ODBC驱动,而连接到另一台SQL Server则使用SQLNCLI或MSOLEDBSQL提供程序。 然后,要提到权限问题,因为用户可能遇到执行权限错误。引用[3]提到需要开启 Ad Hoc Distributed Queries,这需要管理员权限。这部分需要提醒用户注意,并提供开启的SQL命令。 安全问题也很重要,用户可能不知道使用明文密码的风险,应该建议使用更安全的方式,如Windows身份验证或密连接,如引用[3]和[4]中提到的转发利用可能带来的风险。 此外,用户可能需要知道如何读取Excel文件,这也是OPENROWSET的常见用途。需要示例,比如使用Microsoft.ACE.OLEDB.12.0提供程序,并指出需要安装相应的驱动。 最后,生成相关问题,帮助用户进一步学习。比如如何优化性能、权限配置、安全措施等。 需要确保所有代码示例正确,语法符合用户提供的引用中的示例,比如引用[2]中的SQL语句结构。同时,检查LaTeX格式是否正确,数学表达式是否用$...$,独立公式用$$...$$,但当前内容可能涉及较少数学公式,但如果有变量或参数,需要正确应用格式。 还要注意使用中文回答,结构清晰,分步骤说明,并在适当位置添引用标识。例如,在提到需要启用Ad Hoc时引用[4],提到安全问题引用[3]。 现在组织这些信息,确保每个部分都有对应的引用,并且语言自然流畅。同时,检查是否有遗漏的关键点,比如参数说明、驱动版本差异(如MSOLEDBSQL替代SQLNCLI)等,可能需要补充说明。</think>在 SQL Server 中,`OPENROWSET` 是通过 OLE DB 访问远程数据库的特殊函数,支持跨数据源查询和批量操作。以下是具体方法及示例: ### 一、基本语法 $$ SELECT * FROM OPENROWSET('provider_name', 'connection_string', 'query_or_table') $$ ### 二、连接远程 SQL Server **示例**:查询远程 SQL Server 数据库的表 ```sql SELECT * FROM OPENROWSET( 'SQLNCLI', 'Server=192.168.1.100;uid=sa;pwd=Pass123;Database=Northwind', 'SELECT * FROM Orders' ) ``` 需启用 Ad Hoc Distributed Queries 配置: ```sql EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE; ``` [^4] ### 三、连接其他数据库(MySQL) **示例**:通过 ODBC 驱动连接 MySQL ```sql SELECT * FROM OPENROWSET( 'MSDASQL', 'DRIVER={MySQL ODBC 8.0 Unicode Driver};SERVER=10.0.0.5;DATABASE=test;UID=root;PWD=mysql123', 'SELECT id, name FROM products' ) ``` 需预先配置 MySQL ODBC 驱动[^1] ### 四、读取 Excel 文件 **示例**:导入 Excel 数据 ```sql SELECT * FROM OPENROWSET( 'Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=YES;Database=C:\data\sales.xlsx', 'SELECT * FROM [Sheet1$]' ) ``` 需安装 Access Database Engine ### 五、安全注意事项 1. **避免明文密码**:建议使用 Windows 身份验证或密连接字符串 2. **最小权限原则**:单独创建仅具备查询权限的账户 3. **防范注入攻击**:禁止直接拼接动态 SQL(如 `EXEC('SELECT * FROM ' + @table)`)[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值