Postgresql ODBC驱动,用sqlserver添加dblink跨库访问postgresql数据库

2023-11-16

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

declare @rowcount int
set @rowcount = 0
set @rowcount =(select COUNT(*) from sys.servers where name = 'ITSV2')
if @rowcount <= 0 
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='123456'    --对方数据库密码

 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)

 

转载于:https://www.cnblogs.com/i-mengli/p/10280634.html

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

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

  • m个苹果放入n个盘子

    题目描述 把M个同样的苹果放在N个同样的盘子里 允许有的盘子空着不放 问共有多少种不同的分法 用K表示 5 1 1和1 5 1 是同一种分法 输入 每个用例包含二个整数M和N 0 lt m lt 10 1 lt n lt 10 样例输入 7
  • mybatis的环境搭建

    mybatis的环境搭建 1 创建maven工程并导入坐标 创建mybatis需要的依赖有下面几个
  • vue H5页面跳转小程序及其传参小程序并接收

    第一次做H5跳转小程序 记录一下 代码前的配置不多说看文档 目录 微信开放文档 这里我们用到开放标签 跳转小程序 wx open launch weapp 使用之前需要在入口文件pubilc目录下index html文件下引入jssdk h
  • 使用Hexo 配置自己的博客

    安装前提 在Windows下可以到git官网 推荐使用代理 或者对应的镜像网站进行下载 安装git客户端 安装node js 使用git bash 安装 cURL curl https raw github com creationix n
  • Zotero:按GB/T7714 2015引用参考文献

    欢迎关注 ManTou馒头公众号 原创不易 转载请注明出处 点赞收藏再走 主要解决引用英文文献作者超过3个时出现 等 而不是 etal 的问题 Zotero 按GB T7714 2015引用参考文献 导入China National Sta
  • 剖析vue常见问题(一)之v-for与v-if的优先级

    背景 vue中经常使用到v for和v if 那么它们的优先级是怎么样的呢 怎么才能实现性能优化呢 下面来简单分析一下 如何分析 请参考以下测试demo 以及源码中参考src compiler codegen index js demo代码
  • 棋盘覆盖问题-递归分治

    输入 3 3 4 输出 如图 x 3 y 3代表特殊方块的坐标 坐标原点在坐标系左上角 如图也就是一个 size 4 的L型骨牌的棋盘覆盖问题 include
  • maven集成cucumber,mvn test单元测试不运行

    maven集成cucumber mvn test单元测试不运行 项目已集成cucumber jacoco测试覆盖率100 在application项目添加单元测试 覆盖率下降 发现单元测试覆盖的语句覆盖率没有统计到 经试验 发现是appli
  • Java Web工程中的web.xml配置文件

    Java Web工程中的web xml配置文件 前言 1 xml文件 xml文件 Extentsible Markup Language即可扩展标记语言 是用来定义其它语言的一种元语言 其前身是SGML 标准通用标记语言 xml文件是互联网
  • vue axios 跨域,携带cookie

    前端设置 axios 跨域 const axios require axios axios defaults withCredentials true 后端设置 express app use function req res next r
  • 宏函数、普通函数、内联函数的区别

    示例代码 宏函数 define SUM x x x 内联函数 inline int sum int x return x x 普通函数 int sum int x return x x 什么是内联函数 在普通函数定义时加上 inline 关
  • TCP/IP 协议——知识集锦

    精通 TCP IP 熟练使用 Socket 进行网路编程 这句话在招聘要求里经常见 但是平时压根用不到 虽然笔者用Unity3D 如果做联网需要用到Socket通信 奈何我还没做过网络游戏 这里补下相关知识 目录 1 什么是 TCP IP
  • Java——3.字符串的替换和去除空格操作_replace ()和 trim ()方法

    程序开发中 用户输入数据时经常会有一些错误和空格 这时可以使用 String 类的 replace 和 trim 方法 进行字符串的替换和去除空格操作 ExampleAPI04 public class ExampleAPI04 publi
  • tf卡低级格式化_tf卡写保护怎么去掉 磁盘被写保护解决方法

    今天智智教大家如何去除TF卡写的保护 MicroSD 卡是一种极细小的快闪存储器卡 原本这种记忆卡称为T Flash 有时候我们会遇到tf卡写保护的情况 要解除写保护 先确认一下是否真的被写保护 鼠标右键点击移动硬盘 属性 看看你的文件属性
  • R语言中使用dplyr包进行排序与添加序号的实战

    R语言中使用dplyr包进行排序与添加序号的实战 在R语言中 dplyr是一个非常强大的数据处理包 它提供了一套简洁而一致的函数 用于对数据进行筛选 排序 汇总和变形等操作 本文将介绍如何使用dplyr包进行排序 并为数据添加序号 首先 让
  • java的反射机制Class.forName()

    Class forName 方法的作用 就是初始化给定的类 1 Class 类概念 Class 也是一个 Java 类 保存的是与之对应 Java 类的 meta信息 元信息 用来描述这个类的结构 比如描述一个类有哪些成员 有哪些方法等 一
  • 【网易严选】iOS持续集成打包(Jenkins+fastlane+nginx)

    本文来自网易云社区 作者 孙娇 严选iOS客户端的现有打包方式是通过远程连接打包机执行脚本去打包 打完包会输出相应的ipa的二维码 扫一扫二维码可以安装 但是随着测试队伍的壮大 外包同学越来越多 在打包机输入命令的方式可用度越来越低 手动输
  • 170_web服务器_两个需求【1-】获取虚拟机上数据库数据显示到网页 【2-】网页下拉框数据,发送到MQTT服务器上【html实现网页,.js实现内在,.cgi实现内核】

    实例 html 两个功能一起实现在网页 表面
  • 三种方法带你新建一个SpringBoot项目

    SpringBoot 的设计目的是简化Spring的搭建与开发 尤其是没有了好多繁琐的配置 本篇文章主要介绍如何搭建SpringBoot项目 从官网创建 访问Spring的官方网站 https start spring io 如下 只需要简
  • 小学生创客教学

    在这个互联网 的时代 我们的孩子接受到的信息越来越多 创课要彻底改变传统课程存在的过分传授 形式固化 单调无趣的现状 给学生更多自由探索的空间 激发孩子内在的创造潜能 格物斯坦认为 学生不再是被动的学习者 而是可以像科学家一样以研究的方式去

随机推荐

  • 经典面试题 TCP和UDP有什么区别?

    经典面试题 TCP和UDP有什么区别 解决面试题 斩获心仪的 Offer 文章目录 经典面试题 TCP和UDP有什么区别 一 TCP和UDP是什么 二 TCP和UDP有什么区别 1 TCP和UDP区别总结 2 TCP三次握手和四次挥手 2
  • 数据库的用户信息表设计

    用户信息表在很多情况下都需要有 属于一个项目开篇的基础 这个不搞好以后就会给自己带来麻烦 我参考该博文设计 浅谈数据库用户表结构设计 只是有些地方我实践之后需要补充一下 user表字段 user auth表 要补充说明的是 nickname
  • 2.Java设计模式-----抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式 Abstract Factory 是23种设计模式之一 抽象工厂模式是这样子定义的 抽象工厂模式 提供一个创建一系列相关或互相依赖对象的接口 而无需指定它们具体的类 在学习抽象工厂模式之前 最好熟悉简单工厂模式以及工厂方法模式
  • java微信小程序授权 获取用户信息、获取openid和session_key 获取用户unionId、(用户数据的签名验证和加解密)JAVA版

    更新 在18年4月25日小程序做了一次更新 小程序授权不再支持直接弹框获取用户信息授权了 微信小程序授权 获取用户信息里也做了说明 以下代码也已经做了更改 在实际的小程序开发中 往往需要用户授权登陆并获取用户的数据 小程序可以通过微信官方提
  • 贪吃蛇的初步尝试

    1 首先让贪吃蛇动起来 每输入一个方向字符 然后贪吃蛇朝那个方向移动一格 用 kbhit 函数可以让它朝一个方向一直移动 但那速度极快 于是用 speed 函数调整它的速度 达到每秒移动一格的效果 每一步的移动都用一个 for 循环实现 让
  • 学习如何使用最强大的 JavaScript 函数

    今天你将学习如何使用 最强大的 JavaScript函数 数组归约 Array reduce是最强大的 JavaScript Function 时期 reduce有什么作用 为何如此强大 这是reduce的技术定义 Array protot
  • Mybatis高性能批量插入方法

    当使用Mybatis大量插入时可以利用MySQL语句的特性使原来多次请求插入的语句变成一次请求 以此提高插入效率 一般的插入方式 1000条数据 一条一条的插入 Test public void testInsert SqlSession
  • 【rust/egui】(十)使用painter绘制一些图形—connections

    说在前面 rust新手 egui没啥找到啥教程 这里自己记录下学习过程 环境 windows11 22H2 rust版本 rustc 1 71 1 egui版本 0 22 0 eframe版本 0 22 0 上一篇 这里 绘制连接 在上一节
  • Invalid attempt to spread non-iterable instance

    这一类错误大概率是你的延展运算符附近除了错误 比如我的就是应为在一个对象前面用了延展运算符 我将数组的中括号写成了大括号 就报了这个错误
  • Mac 系统的 MySQL 如何修改密码(保姆级别教程)

    要修改 Mac 系统上的 MySQL 密码 可以按照以下步骤进行 打开终端 以管理员身份登录到 MySQL 服务器 sudo mysql u root p 输入管理员密码 切换到 MySQL 数据库 use mysql 查看当前用户列表 s
  • 记录的Android开发过程中遇到的问题。

    180508 更新 网上下载demo 本地studio版本和demo版本不一致处理方式 修改两处 1 项目的build gradle 里面classpath 2修改项目目录下 gradle gt wrapper gt gradle wrap
  • openpcdet验证已训练好权重文件

    python tools test py cfg file 配置文件路径 ckpt dir 权重文件所在文件夹路径 eval all
  • Java静态修饰符static

    1 Satic注意事项 1 Static修饰的方法可以被类调用或者直接使用 而未被static修饰的方法是实例方法 属于对象的 必须用对象调用 2 类在方法区 方法在栈内存 对象在堆内存 3 静态只能访问静态 不能访问实例 实例可以访问静态
  • windows7的5次shift实验

    原理 在win7的登录界面连续按5次shift键会弹出程序c windows system32 sethc exe 在开启win7时会出现正常登录和尝试修复 在尝试修复界面利用txt文本打开C盘 修改cmd exe为sethc exe 并将
  • FastDFS文件同步机制简介

    FastDFS文件同步机制简介 本篇文章转载于FastDFS作者 余庆 大佬的 FastDFS分享与交流 公众号 FastDFS 文件同步采用 binlog 异步复制方式 storage server 使用 binlog 文件记录文件上传
  • c语言警告文件末尾没有换行符,关于c ++:“文件末尾没有换行符”警告,即使在换行后也是如此...

    我最近一直在努力学习C 直到今天一直都很顺利 我正在尝试创建一个非常简单的应用程序 它基本上只是要求用户输入一个数字 然后显示该数字的阶乘 当我尝试在Cygwin中编译文件 g factorial cpp o fact 时 我收到以下警告
  • 微信小程序触底加载scroll-view

    微信小程序触底加载 scroll view 了解什么是触底加载 需求 有个固定高度的容器 实现容器里面的内容触底加载 1 内容盒子的高度 2 盒子里内容的总高度 3 滚动条的scrollTop 触底加载的原理就是 当里面的容器触底的时候进行
  • CPU核心数,线程数,时间片轮转机制解读

    CPU的核心数 CPU个数 是指物理上 即硬件上的核心数 核心数 是逻辑上的 简单理解为逻辑上模拟出的核心数 线程数 是同一时刻设备能并行执行的程序个数 线程数 cpu个数 核数 区分CPU线程数与JAVA多线程的概念 CPU线程数 在CP
  • 计算机的计算单位

    容量单位 在物理层面 高低电平记录信息 理论上只认识0 1两种状态 0 1能够表示的内容太少了 需要更大的容量表示方法 0 1称为bit 比特位 字节 1Byte 8bits 硬盘商一般使用10进位标记容量 500G一般格式化后只剩465G
  • Postgresql ODBC驱动,用sqlserver添加dblink跨库访问postgresql数据库

    在同样是SQLserver数据库跨库访问时 只需要以下方法 declare rowcount int set rowcount 0 set rowcount select COUNT from sys servers where name