在同样是SQLserver数据库跨库访问时,只需要以下方法

declare @rowcount int
set @rowcount =
set @rowcount =(select COUNT(*) from sys.servers where name = 'ITSV2')
if @rowcount <=
begin
exec sp_addlinkedserver 'ITSV2', ' ', 'SQLOLEDB', '192.168.0.222,8989' --IP,端口号
end
exec sp_addlinkedsrvlogin 'ITSV2','false',null, 'sa', 'sa1234' --数据库链接账号、密码
--select * from [ITSV2].数据库.dbo.表

做项目的时候遇到数据对接问题,需要从其他地方同步数据到本项目,本项目是使用sqlserver数据库,而对方使用的是postgresql数据库。

一、下载安装postgresql ODBC驱动

在PostgreSql官网下载ODBC驱动,网址:https://www.postgresql.org/ftp/odbc/versions/msi/

本数据库所在的服务器是64位,我找最新版本的64位的

下载下来为  psqlodbc_x64.msi

在网上有人下载使用的的另一个,这个是收费的,但是有免费使用期。

下载好后放在本项目数据库所在服务器上,安装,直接点下一步就好了,

二、ODBC添加数据源

找到控制面板--管理工具--数据源(ODBC)--系统DSN

找到postgresql-完成 ,然后输入对方的数据库信息,点击测试,显示连接成功。说明和对方的数据库可以连接了。

三、数据库添加dblink,连接对方postgresql,查询数据

1、在数据库中添加linkedserver

execute sp_addlinkedserver
@server='sourceDB', --被访问的服务器别名,可以自己定义
@srvproduct='Any',
@provider='MSDASQL',
@datasrc='PostgreSQL35W' --被访问的服务器地址(IP地址,端口号\服务器名称) --PostgreSQL35W 上面第二步设置的名称
--创建本地用户与远程服务器中用户之间的映射 execute sp_addlinkedsrvlogin
@rmtsrvname='sourceDB', --被访问的服务器别名 ,
@useself='false', --是否通过模拟本地登录名或显式提交登录名和密码来连接到远程服务器
@locallogin=null, --本地登录
@rmtuser='user01', --对方数据库用户名
@rmtpassword='' --对方数据库密码

 2、select * from sys.servers 查到刚才添加的,说明添加成功。

--显示的linkedserver
--select * from sys.servers --同步数据后 可以关闭连接,
--删除运行本地与远程之间的用户映射
--execute sys.sp_droplinkedsrvlogin @rmtsrvname='sourceDB',@locallogin=null
--删除链接服务器
--execute sys.sp_dropserver @server='sourceDB'

 3、查询数据

此处可能会遇到的问题:

(1)对方postgresql版本可能较低,需要查询语句中字段、表名都需要加双引号,如果不加会出错,提示不存在表

错误信息:

链接服务器"sourceDB"的 OLE DB 访问接口 "MSDASQL" 返回了消息 "ERROR: relation "lgs_purchaseorder" does not exist;
No query has been executed with that handle"。
消息 7350,级别 16,状态 2,第 114 行
无法从链接服务器 "sourceDB" 的 OLE DB 访问接口"MSDASQL"获取列信息。

(2)报以下错误,一般在查找数字列的时候出现,这个是所查出的数字精度比较大,而sqlserver 查出所表示的精度没有那么大

解决方法可以是不查数字列,或者是将该数字列转换成字符串表达

SELECT * from openquery(sourceDB,'select "OrderNo","ItemNo","PartNo","Qty" from "LGS_PurchaseOrder" order by "OrderNo" desc limit 100') --查询报以下错误

消息 7356,级别 16,状态 1,第 112 行
链接服务器 "sourceDB" 的 OLE DB 访问接口 "MSDASQL" 为列提供的元数据不一致。
对象 "select "OrderNo","ItemNo","PartNo","Qty" from "LGS_PurchaseOrder" order by "OrderNo" desc limit 100"
的列 "Qty" (编译时序号为 4)在编译时有 6 的 "SCALE",但在运行时有 8。

调整:将数字列调整为字符串

SELECT * from openquery(sourceDB,'select "OrderNo","ItemNo","PartNo",cast("Qty" as char(30)) from "LGS_PurchaseOrder" order by "OrderNo" desc limit 100')

结果:调整后就可以查出数据,就可以拿对方数据库得数据做自己的业务逻辑操作了。

(3) 如何在存储过程中用openquery加参数化查询

一般的加写死的参数方法为

SELECT * from openquery(sourceDB,
'select "OrderNo","ItemNo","PartNo","WindowTime","CloseTime" from "LGS_PurchaseOrder" where "WindowTime" > ''2019-12-18 16:00:00.0000000'' ');

如果需要把条件换成参数,下面这样是不行的,会提示语法错误,

--DECLARE @nowdate NVARCHAR(50)
--SET @nowdate = '2018-08-18 16:00:09.0000000'
SELECT * from openquery(sourceDB,
'select "OrderNo","ItemNo","PartNo","WindowTime","CloseTime" from "LGS_PurchaseOrder"
where "WindowTime" > '''+@nowdate+''' limit 100')

正确的解决方法是用exec执行方式,如下

DECLARE @b VARCHAR(50)
DECLARE @sql varchar(500)
DECLARE @nowdate NVARCHAR(50)
SET @nowdate = '2019-12-18 16:00:09.0000000'
SET @sql ='select * from openquery (sourceDB,''select "OrderNo","ItemNo","PartNo","WindowTime","CloseTime"
from "LGS_PurchaseOrder" where "WindowTime"> '''''+@nowdate+''''''')';
EXEC(@sql)

Postgresql ODBC驱动,用sqlserver添加dblink跨库访问postgresql数据库的更多相关文章

  1. postgresql 模式与用户,及跨库访问

    1 控制台命令\h:查看SQL命令的解释,比如\h select.\?:查看psql命令列表.\l:列出所有数据库.\c [database_name]:连接其他数据库.\d:列出当前数据库的所有表格 ...

  2. oracle使用dblink跨库查询的例子

    本文介绍了oracle数据库使用dblink进行跨库查询的方法,oracle dblink跨库查询教程,需要的朋友参考下.   oracle dblink跨库查询 方法一:首先,创建数据库链接: 复制 ...

  3. PostgreSql 使用dblink跨库

    此篇介绍下psql下dblink的使用方式,帮助自己记录以备后需.dblink是psql下的扩展功能,可以实现在一个数据库中远程操作另外一个数据库,是实现跨库的一种方法.下面步入正文. 安装dblin ...

  4. SqlServer 跨库访问

    同实例跨库 只需要 库名.dbo.表 dbo可省略 如: use Test select * from rdrecords select * from oa.dbo.UserInfo 不同实例与不同i ...

  5. oracle 跨库访问

    创建DBLINK的方法: 1. create public database link dblink connect to totalplant identified by totalplant us ...

  6. Oracle&SQLServer中实现跨库查询

    一.在SQLServer中连接另一个SQLServer库数据 在SQL中,要想在本地库中查询另一个数据库中的数据表时,可以创建一个链接服务器: EXEC master.dbo.sp_addlinked ...

  7. Oracle跨库访问数据表-DBLINK

    1:创建DBLINK(USING后面的连接字符串就是要访问的那个数据库的连接字符串) CREATE DATABASE LINK linkName CONNECT TO userName IDENTIF ...

  8. oracle在进行跨库访问时,采用dblink实现

    首先了解下环境:在tnsnames.ora中配置两个数据库别名:test1/test1@11orcl1.tets2/tets2@12orlc2,在orcl1中创建database link来访问orc ...

  9. PostgreSQL数据库中跨库访问解决方案

    PostgreSQL跨库访问有3种方法:Schema,dblink,postgres_fdw. 方法A:在PG上建立不同SCHEMA,将数据和存储过程分别放到不同的schema上,经过权限管理后进行访 ...

随机推荐

  1. 最近一个dish项目的建设思考

    系统通用能力的沉淀:a.核心模型的数据沉淀 b.通用服务能力的沉淀 ps1:以前重心主要放在了业务的抽象和通过设计模式来增加可复用的扩展性.局限在于,抽象的范围会被单个业务或者当前的业务所束缚,在更大 ...

  2. PYTHON进阶(4)

    学习内容: 1.html简介 2.html标签 3.堡垒机 一.html简介 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语 ...

  3. MFC常见问题总结

    1. c++中的函数前面加个LRESULT是什么意思啊?在微软vc提供的头文件中有定义在winnt.h中typedef long LONG;在windef.h中typedef LONG LRESULT ...

  4. 删除坏掉的 Active Directory Domain

    最近公司的某个 Domain Controller 报告可能由于长时间没在线,同步失败,然后用 Repldiag 工具清理 lingering objects 的过程中,该工具报告存在 serious ...

  5. 我所理解的HTTP协议

    前言 对于HTTP协议,想必大家都不陌生,在工作中经常用到,特别是针对移动端和前端开发人员来说,要获取服务端数据,基本走的网络请求都是基于HTTP协议,特别是RESTFUL + JSON 这种搭配特别 ...

  6. 【转】vim 的各种用法,很实用哦,都是本人是在工作中学习和总结的

    原文地址https://www.cnblogs.com/lxwphp/p/7738356.html (一)初级个性化配置你的vim 1.vim是什么? vim是Vi IMproved,是编辑器Vi的一 ...

  7. python爬虫学习之使用BeautifulSoup库爬取开奖网站信息-模块化

    实例需求:运用python语言爬取http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html这个开奖网站所有的信息,并且保存为txt文件和excel文件. 实 ...

  8. FragmentTabHost用法

    FragmentTabHost组成 Tabhost,TabWidget,切换的内容容器FrameLayout 层级关系 ----FragmentTabHost |-----TabWidget |--- ...

  9. SpringMVC项目容易出现的BUG

    1.400错误:1.语义有误,当前请求无法被服务器理解.除非进行修改,否则客户端不应该重复提交这个请求. 2.请求参数有误. 你发送的请求有误,这个问题去页面提交的地方看. 如:你想删除一条数据,id ...

  10. eclipse如何使用log4j详解,你get了吗???

    1.下载log4j    jar包 log4j下载地址 http://logging.apache.org/log4j/2.x/download.html 2.log4j   jar包引入项目 接下来 ...