在同样是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. FPGA开发随笔汇总

    点击标题即可进入相关随笔. DE-SOC开发板VrilogHDL开发相关部分: (本过程需要Verilog HDL 的基本语言基础) 1.FPGA的发展史及FPGA 的基础架构 2.首先看一下友晶DE ...

  2. Shell文本操作-5

  3. 10.1牛客J题

    https://www.nowcoder.com/acm/contest/201/J Description: 给你一行括号,定义了括号合格的形式,然后Q次询问,问你这个区间内括号是否合格 Solut ...

  4. django2+python3+uwsgi+centos7部署网站

    Centos7中安装Python虚拟环境 2018年08月27日 00:09:36 kaichenkai 阅读数:984 1.为什么要搭建虚拟环境? 问题:如果在一台电脑上, 想开发多个不同的项目, ...

  5. 第一课:Python入门(笔记)

    一.变量 1.什么是变量 #变量即变化的量,核心是“变”与“量”二字,变即变化,量即衡量状态. 2.为什么要有变量 #程序执行的本质就是一系列状态的变化,变是程序执行的直接体现,所以我们需要有一种机制 ...

  6. Ubuntu16.04.1 安装Nginx

    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev ...

  7. SQL参数放在where前后的区别

    本博客记录一个细节,在使用sql left join时候,参数放在left join后面当条件,还是放在where后的区别 给出两条SQL: tt.book_type = 'TIPS_TYPE',放在 ...

  8. Redis 的 8 大应用场景!

    之前讲过Redis的介绍,及使用Redis带来的优势,这章整理了一下Redis的应用场景,也是非常重要的,学不学得好,能正常落地是关键. 下面一一来分析下Redis的应用场景都有哪些. 1.缓存 缓存 ...

  9. 剑指offer【03】- 从尾到头打印链表(4种实现方法)

    题目:从尾到头打印链表 考点:链表 题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 法一:ArrayList头插法 /** * public class ListNode ...

  10. Quartz的使用案例

    一.介绍 项目中的调度任务可以使用Quartz任务调度框架 1.Job接口:这个接口里面只定义了一个方法,excute void execute(JobExecutionContext context ...