注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

SqlServer中OpenQuery用法  

2017-06-21 14:42:47|  分类: 操作系统 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
近日因为公司系统需要,要从SqlServer链接Oracle进行数据同步,所以使用OpenQuery函数在链接服务器上执行查询,这个功能OpenQuery就类似的Oracle的dblink。该链接服务器是 OLE DB 数据源。OpenQuery可以在查询的FROM 子句中引用,做为一个表。虽然任何用户都可以执行OpenQuery,如果使用INSERT、UPDATE或DELETE语句对目标表进行调用,就要取决于OLE DB 访问接口的权限限制了。尽管查询可能返回多个结果集,但是OpenQuery只返回第一个。
Transact-SQL 语法约定也比较简单:

OpenQuery ( linked_server ,'query' )

linked_server表示链接服务器名称的标识符,' query ' 是在链接服务器中执行的查询字符串。该字符串的最大长度为8KB。
OpenQuery不接受参数变量,在 SQLServer 2000 和更高版本中,通过EXEC语句可以在链接服务器上执行存储过程。例如:

SELECT * FROM OpenQuery(linked_server, ’exec WebServer.master.dbo.test’) 

这里的WebServer.master.dbo.test就是要执行的存储过程四部分名称。
1)执行SELECT:

SELECT * FROM OpenQuery (linked_server ,'select * from 表' )

就要记得,这里的表,绝对不能用链接服务器名.数据库名.用户名.表(或视图)的四部分名称查询数据【可能是BUG?】,那怕有权限,但用用户名.表名却是可以的,甚至上述语句也不能简写成如下【会报执行错误】:

SELECT * FROM OpenQuery (linked_server ,'' )

2)执行 UPDATE:

UPDATE OpenQuery (linked_server, 'SELECT name FROM sites WHERE id = 1') SET name = '593668.com' WHERE id='1'

3)执行 INSERT:

INSERT OpenQuery(linked_server, 'SELECT id,name FROM sites') VALUES(2,'237h.com')

4)执行 DELETE

DELETE OpenQuery(linked_server, 'SELECT * FROM sites') WHERE id = '1'

或者

DELETE OpenQuery(linked_server, 'SELECT * FROM sites where id = ''1''')

这里要注意下:T-SQL中,INSERT可以省略INTO,DELETE 也可以省略FROM。 INSERT时必须明确 SELECT 的字段,如果用*,那就是每个字段都要提供。
OpenQuery因为不接受参数变量,所以如下语句是会出错的:

DELETE OpenQuery (linked_server, 'SELECT id FROM sites WHERE id=' + @id)

正常要用如下语句:

DELETE OpenQuery (linked_server, 'SELECT id FROM sites') WHERE id=@id

另外,如果想要效率高,where条件应该尽量放在OpenQuery函数里面,这样在linked_server执行完筛选才RETURN的,如果放在后面,那么就是返回RETURN的数据才再进行筛选,所以如果放后面的话,TABLE的数据量越大越慢。


  评论这张
 
阅读(0)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017