SQL Server访问远程数据库--使用openrowset/opendatasource的方法

2023-05-16

一、使用openrowset/opendatasource前首先要启用Ad Hoc Distributed Queries,因为这个服务不安全SqlServer默认是关闭的。
SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource'的访问,
因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用sp_configure 启用 'Ad Hoc Distributed Queries'。

1、启用Ad Hoc Distributed Queries服务的方法,执行下面的查询语句就可以了:
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Ad Hoc Distributed Queries',1
reconfigure

2、使用完毕后,记得一定要要关闭它,因为这是一个安全隐患,切记执行下面的SQL语句:
exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure 

二、使用示例

-->--创建链接服务器 
exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 
exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' 

--查询示例 
select * from ITSV.数据库名.dbo.表名 

--导入示例 
select * into 表 from ITSV.数据库名.dbo.表名 

--以后不再使用时删除链接服务器 
exec sp_dropserver  'ITSV ', 'droplogins ' 

--连接远程/局域网数据(openrowset/openquery/opendatasource) 
--1、openrowset 

--查询示例 
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 

--生成本地表 
select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 

--把本地表导入远程表 
insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 
select *from 本地表 

--更新本地表 
update b 
set b.列A=a.列A 
from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b 
on a.column1=b.column1 

--openquery用法需要创建一个连接 

--首先创建一个连接创建链接服务器 
exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 
--查询 
select * 
FROM openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ') 
--把本地表导入远程表 
insert openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ') 
select * from 本地表 
--更新本地表 
update b 
set b.列B=a.列B 
FROM openquery(ITSV,  'SELECT * FROM 数据库.dbo.表名 ') as a  
inner join 本地表 b on a.列A=b.列A 

--3、opendatasource/openrowset 
SELECT   * 
FROM   opendatasource( 'SQLOLEDB ',  'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta 
--把本地表导入远程表 
insert opendatasource( 'SQLOLEDB ',  'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名 
select * from 本地表

三、自己写的例子

--openrowset使用OLEDB的一些例子
select * from openrowset('SQLOLEDB','Server=(local);PWD=***;UID=sa;','select * from TB.dbo.school') as t
select * from openrowset('SQLOLEDB','Server=(local);PWD=***;UID=sa;',TB.dbo.school) as t
select * from openrowset('SQLOLEDB','Server=(local);Trusted_Connection=yes;',TB.dbo.school) as t
select * from openrowset('SQLOLEDB','(local)';'sa';'***','select * from TB.dbo.school') as t
select * from openrowset('SQLOLEDB','(local)';'sa';'***',TB.dbo.school) as t
select * from openrowset('SQLOLEDB','(local)';'sa';'***','select school.id as id1,people.id as id2 from TB.dbo.school inner join TB.dbo.people on school.id=people.id') as t

--openrowset使用SQLNCLI的一些例子(SQLNCLI在SqlServer2005以上才能使用)
select * from openrowset('SQLNCLI','(local)';'sa';'***','select * from TB.dbo.school') as t
select * from openrowset('SQLNCLI','Server=(local);Trusted_Connection=yes;','select * from TB.dbo.school') as t
select * from openrowset('SQLNCLI','Server=(local);UID=sa;PWD=***;','select * from TB.dbo.school') as t
select * from openrowset('SQLNCLI','Server=(local);UID=sa;PWD=***;',TB.dbo.school) as t
select * from openrowset('SQLNCLI','Server=(local);UID=sa;PWD=***;DataBase=TB','select * from dbo.school') as t

--openrowset其他使用
insert openrowset('SQLNCLI','Server=(local);Trusted_Connection=yes;','select name from TB.dbo.school where id=1') values('ghjkl')/*要不要where都一样,插入一行*/
update openrowset('SQLNCLI','Server=(local);Trusted_Connection=yes;','select name from TB.dbo.school where id=1') set name='kkkkkk'
delete from openrowset('SQLNCLI','Server=(local);Trusted_Connection=yes;','select name from TB.dbo.school where id=1')

--opendatasource使用SQLNCLI的一些例子
select * from opendatasource('SQLNCLI','Server=(local);UID=sa;PWD=***;').TB.dbo.school as t
select * from opendatasource('SQLNCLI','Server=(local);UID=sa;PWD=***;DataBase=TB').TB.dbo.school as t

--opendatasource使用OLEDB的例子
select * from opendatasource('SQLOLEDB','Server=(local);Trusted_Connection=yes;').TB.dbo.school as t

--opendatasource其他使用
insert opendatasource('SQLNCLI','Server=(local);Trusted_Connection=yes;').TB.dbo.school(name) values('ghjkl')/*要不要where都一样,插入一行*/
update opendatasource('SQLNCLI','Server=(local);Trusted_Connection=yes;').TB.dbo.school set name='kkkkkk'
delete from opendatasource('SQLNCLI','Server=(local);Trusted_Connection=yes;').TB.dbo.school where id=1

--openquery使用OLEDB的一些例子
exec sp_addlinkedserver   'ITSV', '', 'SQLOLEDB','(local)' 
exec sp_addlinkedsrvlogin 'ITSV', 'false',null, 'sa', '***'
select * FROM openquery(ITSV,  'SELECT *  FROM TB.dbo.school ') 

--openquery使用SQLNCLI的一些例子
exec sp_addlinkedserver   'ITSVA', '', 'SQLNCLI','(local)' 
exec sp_addlinkedsrvlogin 'ITSVA', 'false',null, 'sa', '***'
select * FROM openquery(ITSVA,  'SELECT *  FROM TB.dbo.school ') 

--openquery其他使用
insert openquery(ITSVA,'select name from TB.dbo.school where id=1') values('ghjkl')/*要不要where都一样,插入一行*/
update openquery(ITSVA,'select name from TB.dbo.school where id=1') set name='kkkkkk'
delete openquery(ITSVA,'select name from TB.dbo.school where id=1')

四、总结

可以看到SqlServer连接多服务器的方式有3种

其中我个人认为openrowset最好,使用简单而且支持在连接时制定查询语句使用很灵活

openquery也不错查询时也可以指定查询语句使用也很灵活,不过查询前要先用exec sp_addlinkedserver和exec sp_addlinkedsrvlogin建立服务器和服务器连接稍显麻烦

opendatasource稍显欠佳,他无法在连接时指定查询使用起来稍显笨拙

另外还可以连接到远程Analysis服务器做MDX查询,再用T-Sql做嵌套查询,可见T-SQL的远程查询非常强大。

在T-SQL语句中访问远程数据库(openrowset/opendatasource/openquery) - PowerCoder - 博客园

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server访问远程数据库--使用openrowset/opendatasource的方法 的相关文章

  • 使用联接更新表?

    我正在尝试使用表 B 中的数据更新表 A 我以为我可以做这样的事情 update A set A DISCOUNT 3 from INVOICE ITEMS A join ITEM PRICE QUNTITY B on A ITEM PRI
  • 如何将SQL数据加载到Hortonworks中?

    我已在我的电脑中安装了 Hortonworks SandBox 还尝试使用 CSV 文件 并以表结构的方式获取它 这是可以的 Hive Hadoop nw 我想将当前的 SQL 数据库迁移到沙箱 MS SQL 2008 r2 中 我将如何做
  • Snowflake 中的动态 SQL

    当我在雪花中运行动态 SQL 时 遇到以下错误 未完成对 SQL MAIN 的分配 因为值超出了变量的大小限制 它的大小是263 限制为 256 内部存储大小以字节为单位 这是代码 SET v G 1 SET v G1 v G VARCHA
  • 更好地理解 SQL Server 中的架构

    就像标题一样 我还是一个SQLServer菜鸟 当我创建表 Mytable 时 数据库中显示 dbo Mytable 但有人能让我更好地理解模式吗 另外 在 Server 2008 TSQL 一书中 Itzik 说 在你的数据库中 表属于模
  • 如何用约束标记一大组“传递群”?

    在 NealB解决方案之后进行编辑 与以下解决方案相比 NealB的解决方案非常非常快任何另一个 https stackoverflow com q 18033115 answers and 提出了关于 添加约束以提高性能 的新问题 Nea
  • Oracle SQL 函数中可以有 commit 语句吗

    在 SQL 函数中使用 COMMIT 语句是否可能 有意义 从技术上来说 答案是肯定的 你can请执行下列操作 create or replace function committest return number as begin upd
  • 如何拥有引用另一个表的检查约束?

    我在 SQL Server 2008 数据库中有以下表 tblItem 其中有一个ItemID field 好项目 它还有一个 ItemID 字段 并且有一个指向 tblItem 的外键 tblBadItem 它也有一个 ItemID 字段
  • SQL - 需要查找重复记录但排除反向事务

    我有一张交易表 偶尔会有 重复条目 如果 当管理员发现这些重复条目时 他们将撤销交易 从而创建负值 但由于监管要求 原始重复条目仍然保留 我想创建一个 SQL 查询 并使用 Crystal Reports 来制作报告 以便管理员轻松查找重复
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • SQL 标准是否允许函数名和括号之间有空格

    检查一些 RDBMS 我发现类似的事情 SELECT COUNT a SUM b FROM TABLE 允许 注意聚合函数和括号之间的空格 谁能提供一个指向 SQL 标准本身定义的指针 任何版本都可以 编辑 以上在postgres中工作 m
  • 解析错误:语法错误,意外的 T_RETURN [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 遇到这个问
  • 向带有检查约束 SQL 的表添加列

    我想向表中添加一列 然后添加一个检查约束以确保其大于 0 我似乎无法让它在 oracle sl Developer 中运行 Alter TABLE store101 add column Base salary Number 7 2 con
  • 是否可以从子查询中获取多个值?

    有没有办法让子查询在oracle db中返回多列 我知道这个特定的sql会导致错误 但它很好地总结了我想要的 select a x select b y b z from b where b v a v from a 我想要这样的结果 a
  • 具有不同组合的产品和产品包的数据库模型

    您将如何设计数据库来实现此功能 考虑一个场景 我们想要创建一个产品关系 封装 假设我们创建一个产品表 prod id prod name prod fee 1 prepaid A 19 usd 2 prepaid B 29 usd 3 pr
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • 使用 DISTINCT 进行查询需要很长时间

    我正在使用 Microsoft Access 2003 我的项目中的一个表单需要很长时间才能向用户显示 这是适用的查询 SELECT DISTINCT tb KonzeptDaten DFCC tb KonzeptDaten OBD Cod
  • 从表中选择行,其中另一个表中具有相同 id 的行在另一列中具有特定值

    在 MySQL 中 如果我们有两个表 comments key value 1 foo 2 bar 3 foobar 4 barfoo and meta comment key value 1 1 2 1 3 2 4 1 我想得到来自以下人
  • 默认情况下在sql日期时间列中插入null/空值

    如何在 SQL Server 中创建一个表 默认日期时间为空 而不是1900 01 01 00 00 00 000我得到了 我的意思是 如果没有插入值 则默认值应该为 null 空等 如果没有插入值 默认值应该是null empty 在表定
  • Oracle SQL PLS-00049:错误的绑定变量

    我收到此错误 这似乎是列拼写问题 然而 我 99 确信我拼写的所有内容都是正确的 但我看不出有任何理由会出现我所犯的错误 这是来源 CREATE OR REPLACE TRIGGER update qoh trigger AFTER INS
  • 使用函数的 SQL 查询 - 如何获取列表的最大计数

    如何查询 MAXIMUM COUNT 交易次数 我的代码如下 SELECT customer id COUNT customer id FROM rental GROUP BY customer id HAVING MAX COUNT cu

随机推荐

  • 为何某些公司不允许使用 C++ STL

    作者 xff1a 陈甫鸼 链接 xff1a https www zhihu com question 20201972 answer 23454845 来源 xff1a 知乎 著作权归作者所有 xff0c 转载请联系作者获得授权 最初开始禁
  • 如何发明新算法(一)

    如何发明新算法 xff08 一 xff09 算法一直是计算机科学的核心 xff0c 算法改变世界 xff0c 算法创造未来 xff01 这篇文章我主要从复杂化 简单化两个方面谈谈怎么样发明一个新的算法 新算法在时间复杂度 xff0c 空间复
  • python进行http登录

    摘要 xff1a 有时需要用python做一些自动化页面请求 xff0c 但请求又需要登录权限 xff0c 好比如抢票 在有账号密码的情况下 xff0c 可以用request Session进行带session的http请求 xff0c 这
  • Ubuntu14.04 for ROS indigo的安装(电脑配置)

    前言 由于个人需要 xff0c 将笔记本电脑重新装了系统 首先用空白U盘进行系统刻盘 xff0c 然后电脑所有数据备份 xff0c 最后重新安装 装入的系统是exbot 机器人提供的Ubuntu14 04 for ros indigo xf
  • Django自带的加密算法及加密模块

    Django 内置的User类提供了用户密码的存储 验证 修改等功能 xff0c 可以很方便你的给用户提供密码服务 默认的Ddjango使用pbkdf2 sha256方式来存储和管理用的密码 xff0c 当然是可以自定义的 Django 通
  • 如何在Python中使用“ with open”打开多个文件?

    我想一次更改几个文件 xff0c 前提是我可以写入所有文件 我想知道我是否可以将多个打开调用与with语句结合with xff1a try with open 39 a 39 39 w 39 as a and open 39 b 39 39
  • 工业控制领域的期刊

    我们都知道目前做控制的大体分两大类人 xff0c 一类是做纯控制理论的 xff0c 主要是跟数学打交道 xff1b 另一类是做控制理论在各个行业的应用的 xff0c 其中包括电力系统 xff0c 机器人 xff0c 智能交通 xff0c 航
  • VNC 灰屏

    用vnc连接服务器的时候 xff0c 出现了灰屏 xff0c xff08 在xshell可以正常运行 xff09 上面会显示三个checkbox xff1a Accept clipboard from viewers Send clipbo
  • Ubuntu卸载python3.6

    注意 xff1a 这里说一下 xff0c 系统自带的python3 6可别乱删 xff0c 这个是我自己下载的python3 6 若你们有想卸载系统自带的python3 6 xff0c 可千万别去卸载 xff01 一般会开机都开不起 xff
  • 深度学习之BP神经网络

    深度学习之BP神经网络 BP xff08 Back Propagation xff09 网络是1986年由Rumelhart和McCelland为首的科学家小组提出 xff0c 是一种按误差逆传播算法训练的多层前馈网络 它的学习规则是使用最
  • 【ROS】源码分析-消息订阅与发布

    说明 本文通过NodeHandle subscribe和Publication publish 源码作为入口 xff0c 来分析PubNode SubNode之间是网络连接是如何建立的 xff0c 消息是如何发布的 xff0c topic队
  • Opencv-cvtColor

    cvtColor不是cv的成员 头文件的问题 include lt opencv2 opencv hpp gt 这个就可以
  • java听课笔记——9.25

    记录今天所学的东西 xff1a 1 Random 用于随机生成一个值 xff0c 可以有限定范围 xff0c 没有尝试过不设限制的随机 用法如下 xff1a Random random 61 new Random int temp 61 r
  • java听课笔记——10.09

    1 局部变量和全局变量 xff1a 2 匿名内部类比较和外部比较 匿名内部类的比较 xff0c 即在需要进行比较的类名后加上implements comparator lt 类名 gt 然后 xff0c 使用sort xff0c 对于sor
  • java听课笔记——10.10

    1 String与常量池 xff1a 常量池是java中的一个存储常量的存储器 xff0c 栈是一个临时的存储器 xff0c 在递归的时候比较明显 xff0c 函数的运行压缩在栈里 String str3 61 new String 34
  • Java听课笔记——10.30

    感觉今天没讲什么东西唉 一开始 xff0c 解释了一下ArrayList里的每个元素如果不进行类型约束的话 自然赋值为Object类 xff0c 而且是兼收并蓄的 同时讲了使用迭代器对ArrayList数组进行遍历 xff0c 直接上代码
  • 如何在Python中声明一个数组?

    如何在Python中声明数组 xff1f 我在文档中找不到任何对数组的引用 1楼 这个怎么样 gt gt gt a 61 range 12 gt gt gt a 0 1 2 3 4 5 6 7 8 9 10 11 gt gt gt a 7
  • openrave0.9安装遇到依赖问题及解决流程

    问题 cmake 时输出下面的失败信息 xff0c 虽然最后可以make install xff08 其实就是拷贝了库文件 xff09 安装上 xff0c 但是由于过程中有些步骤失败 xff0c 导致执行时缺少一些库文件 xff0c 无法执
  • Python入门--一篇搞懂什么是类

    写一篇Python类的入门文章 xff0c 在高级编程语言中 xff0c 明白类的概念和懂得如何运用是必不可少的 文章有点长 xff0c 3000多字 Python是面向对象的高级编程语言 xff0c 在Python里面 一切都是对象 xf
  • SQL Server访问远程数据库--使用openrowset/opendatasource的方法

    一 使用openrowset opendatasource前首先要启用Ad Hoc Distributed Queries xff0c 因为这个服务不安全SqlServer默认是关闭的 SQL Server 阻止了对组件 39 Ad Hoc