跨服务器跨数据库查询制作报表

时间:2021-08-08 06:12:04
需求如题, 解决思路是: 将 A 数据库服务器的 OA库中的数据查询出来,存放到 B 数据库服务器上的临时表(或建普通表),再从B数据库服务器上的临时表(或普通表)中读取数据。(附:A 数据库服务器的 OA库中,要取的数据量都在 50W 以下,且都是MS SQLSERVER)
请问,  综合考虑,是用临时表实现好 还是能用 普通表实现好?  或者还是有其他什么更好的解决方案? 

26 个解决方案

#1


借用ETL定时把数据同步过来。报表只使用本地数据

#2


直接从A上读取不行吗?为什么要放到B的临时表上?

#3


引用 1 楼 zengertao 的回复:
借用ETL定时把数据同步过来。报表只使用本地数据


定时任务同步数据是要考虑的, 求分析下用临时表和普通表的优劣

#4


引用 2 楼 sinat_28984567 的回复:
直接从A上读取不行吗?为什么要放到B的临时表上?


直接从A上读取性能上不是很好,而且后面是要既要从 A 上读取又要从 B 上同时读取的情况

#5


注意,要考虑既要从 A 上读取又要从 B 上同时读取数据的情况

#6


引用 4 楼 skystore的回复:
Quote: 引用 2 楼 sinat_28984567 的回复:

直接从A上读取不行吗?为什么要放到B的临时表上?


直接从A上读取性能上不是很好,而且后面是要既要从 A 上读取又要从 B 上同时读取的情况

如果后续还要经常查询。用实体表,,你这不就是做读写分离吗。可以直接用发布订阅这样的方式来做数据同步

#7


引用 6 楼 z10843087 的回复:
Quote: 引用 4 楼 skystore的回复:
Quote: 引用 2 楼 sinat_28984567 的回复:

直接从A上读取不行吗?为什么要放到B的临时表上?


直接从A上读取性能上不是很好,而且后面是要既要从 A 上读取又要从 B 上同时读取的情况

如果后续还要经常查询。用实体表,,你这不就是做读写分离吗。可以直接用发布订阅这样的方式来做数据同步


不是的, 从 A 上读取数据时,只取报表所需要的数据及要过滤查询的列, 并不是A  上有新增数据行时,就需要同步过来

#8


引用 6 楼 z10843087 的回复:
Quote: 引用 4 楼 skystore的回复:
Quote: 引用 2 楼 sinat_28984567 的回复:

直接从A上读取不行吗?为什么要放到B的临时表上?


直接从A上读取性能上不是很好,而且后面是要既要从 A 上读取又要从 B 上同时读取的情况

如果后续还要经常查询。用实体表,,你这不就是做读写分离吗。可以直接用发布订阅这样的方式来做数据同步


后面是需要 频繁查询的

#9


如果实时性要求不高,你就写sql 同步也可以。就用实体表把。

#10


引用 9 楼 z10843087 的回复:
如果实时性要求不高,你就写sql 同步也可以。就用实体表把。


实时性要求是不高, 因为 A 的系统最终 是要被 B 的系统给迭代的, 但 写sql 同步 估计也得写定时服务, 每天跑一次

#11


引用 3 楼 u011797908 的回复:
Quote: 引用 1 楼 zengertao 的回复:

借用ETL定时把数据同步过来。报表只使用本地数据


定时任务同步数据是要考虑的, 求分析下用临时表和普通表的优劣

跨服读取用临时表,太过依赖网络传输,万一断个网什么的不就GG了。当然是存在本地的实体表用起来靠谱

#12


用普通表吧, 你可以参考这篇博客: http://blog.csdn.net/yenange/article/details/58135245
作业步骤:
1. 清空目标表;
2. 同步表;
3. 生成报表。

#13


引用 12 楼 yenange 的回复:
用普通表吧, 你可以参考这篇博客: http://blog.csdn.net/yenange/article/details/58135245
作业步骤:
1. 清空目标表;
2. 同步表;
3. 生成报表。


你这个作业是在 A 中已有的物理表,我这边的情况是 从 A中多表查询出的结果

#14


引用 12 楼 yenange 的回复:
用普通表吧, 你可以参考这篇博客: http://blog.csdn.net/yenange/article/details/58135245
作业步骤:
1. 清空目标表;
2. 同步表;
3. 生成报表。


打算写个定时服务去定时每天同步报表数据到 B 库中的物理表

#15


引用 13 楼 u011797908 的回复:
Quote: 引用 12 楼 yenange 的回复:

用普通表吧, 你可以参考这篇博客: http://blog.csdn.net/yenange/article/details/58135245
作业步骤:
1. 清空目标表;
2. 同步表;
3. 生成报表。


你这个作业是在 A 中已有的物理表,我这边的情况是 从 A中多表查询出的结果


一样的, 导入导出向导可以是物理表, 也可以是一个查询, 比你想象的灵活。
跨服务器跨数据库查询制作报表
跨服务器跨数据库查询制作报表

我们做过一些测试, 导入导出向导在速度和稳定性方面控制得非常好。

#16


引用 15 楼 yenange 的回复:
Quote: 引用 13 楼 u011797908 的回复:

Quote: 引用 12 楼 yenange 的回复:

用普通表吧, 你可以参考这篇博客: http://blog.csdn.net/yenange/article/details/58135245
作业步骤:
1. 清空目标表;
2. 同步表;
3. 生成报表。


你这个作业是在 A 中已有的物理表,我这边的情况是 从 A中多表查询出的结果


一样的, 导入导出向导可以是物理表, 也可以是一个查询, 比你想象的灵活。
跨服务器跨数据库查询制作报表
跨服务器跨数据库查询制作报表

我们做过一些测试, 导入导出向导在速度和稳定性方面控制得非常好。



哦哦, 用的不多, 还在撸代码当中,过两天测试下  跨服务器跨数据库查询制作报表

#17


引用 16 楼 u011797908 的回复:
哦哦, 用的不多, 还在撸代码当中,过两天测试下  跨服务器跨数据库查询制作报表


嗯嗯, 你的数据量也不算大, 写程序或用作业都可以, 区别不大吧。 

没事就结贴吧

#18


引用 17 楼 yenange 的回复:
Quote: 引用 16 楼 u011797908 的回复:

哦哦, 用的不多, 还在撸代码当中,过两天测试下  跨服务器跨数据库查询制作报表


嗯嗯, 你的数据量也不算大, 写程序或用作业都可以, 区别不大吧。 

没事就结贴吧


跨服务器跨数据库查询制作报表

最近刚做到同步这一块,从A服务器上的db定时同步数据到B服务器上的db,  之前写同步脚本是用链接服务器, 现按照你的方法,做成导入 SSIS包, 也用到了链接服务器,但提示报错?不知大神有无其它更优的解决方案?

#19


按提示应该是没有建立对应名称的链接服务器。

如果你觉得太复杂就用程序吧,  跨服务器跨数据库查询制作报表

#20


引用 19 楼 yenange 的回复:
按提示应该是没有建立对应名称的链接服务器。

如果你觉得太复杂就用程序吧,  跨服务器跨数据库查询制作报表


周末还这么快就回复我了,赞! 新建一个查询窗口,测试这个服务器链接, 是没有问题的, 放入到导入导出向导中的自定义脚本里就有问题, 而且我删除链接,重新新建也不行

我倒是很想用用 SSIS 包 + 作业 实现这个功能 !!! 

#21


你创建链接服务器的过程不要放到作业脚本里啊!
创建好了, 作业里面直接调用就是了

#22


引用 21 楼 yenange 的回复:
你创建链接服务器的过程不要放到作业脚本里啊!
创建好了, 作业里面直接调用就是了


我也这么认为的, 最开始我就是这么做的,就是报这个错,我才在这里加 链接服务器的

跨服务器跨数据库查询制作报表

#23





引用 21 楼 yenange 的回复:
你创建链接服务器的过程不要放到作业脚本里啊!
创建好了, 作业里面直接调用就是了
跨服务器跨数据库查询制作报表

我有点怀疑, 导入导出SSIS包是不是不能用 链接服务器 跨服务器跨数据库查询制作报表

#24


在B服务器上,一句话搞定
select * into tableB from Openrowset('sqloledb','hosta';'sa';'xxxx','select * from Tablea')
既然无实时性要求,每天晚上跑一下

#25


引用 24 楼 yisuylm 的回复:
在B服务器上,一句话搞定
select * into tableB from Openrowset('sqloledb','hosta';'sa';'xxxx','select * from Tablea')
既然无实时性要求,每天晚上跑一下


要倒的表少的话,我也倒也要用这种方式 , 简单省事, 关键是有3,40张表,导入数据的脚本都写了 700多行, 所以想用个安逸点的方法

#26


没人来了吗?再加10分  跨服务器跨数据库查询制作报表
不行的用用作业分步解决了!

#1


借用ETL定时把数据同步过来。报表只使用本地数据

#2


直接从A上读取不行吗?为什么要放到B的临时表上?

#3


引用 1 楼 zengertao 的回复:
借用ETL定时把数据同步过来。报表只使用本地数据


定时任务同步数据是要考虑的, 求分析下用临时表和普通表的优劣

#4


引用 2 楼 sinat_28984567 的回复:
直接从A上读取不行吗?为什么要放到B的临时表上?


直接从A上读取性能上不是很好,而且后面是要既要从 A 上读取又要从 B 上同时读取的情况

#5


注意,要考虑既要从 A 上读取又要从 B 上同时读取数据的情况

#6


引用 4 楼 skystore的回复:
Quote: 引用 2 楼 sinat_28984567 的回复:

直接从A上读取不行吗?为什么要放到B的临时表上?


直接从A上读取性能上不是很好,而且后面是要既要从 A 上读取又要从 B 上同时读取的情况

如果后续还要经常查询。用实体表,,你这不就是做读写分离吗。可以直接用发布订阅这样的方式来做数据同步

#7


引用 6 楼 z10843087 的回复:
Quote: 引用 4 楼 skystore的回复:
Quote: 引用 2 楼 sinat_28984567 的回复:

直接从A上读取不行吗?为什么要放到B的临时表上?


直接从A上读取性能上不是很好,而且后面是要既要从 A 上读取又要从 B 上同时读取的情况

如果后续还要经常查询。用实体表,,你这不就是做读写分离吗。可以直接用发布订阅这样的方式来做数据同步


不是的, 从 A 上读取数据时,只取报表所需要的数据及要过滤查询的列, 并不是A  上有新增数据行时,就需要同步过来

#8


引用 6 楼 z10843087 的回复:
Quote: 引用 4 楼 skystore的回复:
Quote: 引用 2 楼 sinat_28984567 的回复:

直接从A上读取不行吗?为什么要放到B的临时表上?


直接从A上读取性能上不是很好,而且后面是要既要从 A 上读取又要从 B 上同时读取的情况

如果后续还要经常查询。用实体表,,你这不就是做读写分离吗。可以直接用发布订阅这样的方式来做数据同步


后面是需要 频繁查询的

#9


如果实时性要求不高,你就写sql 同步也可以。就用实体表把。

#10


引用 9 楼 z10843087 的回复:
如果实时性要求不高,你就写sql 同步也可以。就用实体表把。


实时性要求是不高, 因为 A 的系统最终 是要被 B 的系统给迭代的, 但 写sql 同步 估计也得写定时服务, 每天跑一次

#11


引用 3 楼 u011797908 的回复:
Quote: 引用 1 楼 zengertao 的回复:

借用ETL定时把数据同步过来。报表只使用本地数据


定时任务同步数据是要考虑的, 求分析下用临时表和普通表的优劣

跨服读取用临时表,太过依赖网络传输,万一断个网什么的不就GG了。当然是存在本地的实体表用起来靠谱

#12


用普通表吧, 你可以参考这篇博客: http://blog.csdn.net/yenange/article/details/58135245
作业步骤:
1. 清空目标表;
2. 同步表;
3. 生成报表。

#13


引用 12 楼 yenange 的回复:
用普通表吧, 你可以参考这篇博客: http://blog.csdn.net/yenange/article/details/58135245
作业步骤:
1. 清空目标表;
2. 同步表;
3. 生成报表。


你这个作业是在 A 中已有的物理表,我这边的情况是 从 A中多表查询出的结果

#14


引用 12 楼 yenange 的回复:
用普通表吧, 你可以参考这篇博客: http://blog.csdn.net/yenange/article/details/58135245
作业步骤:
1. 清空目标表;
2. 同步表;
3. 生成报表。


打算写个定时服务去定时每天同步报表数据到 B 库中的物理表

#15


引用 13 楼 u011797908 的回复:
Quote: 引用 12 楼 yenange 的回复:

用普通表吧, 你可以参考这篇博客: http://blog.csdn.net/yenange/article/details/58135245
作业步骤:
1. 清空目标表;
2. 同步表;
3. 生成报表。


你这个作业是在 A 中已有的物理表,我这边的情况是 从 A中多表查询出的结果


一样的, 导入导出向导可以是物理表, 也可以是一个查询, 比你想象的灵活。
跨服务器跨数据库查询制作报表
跨服务器跨数据库查询制作报表

我们做过一些测试, 导入导出向导在速度和稳定性方面控制得非常好。

#16


引用 15 楼 yenange 的回复:
Quote: 引用 13 楼 u011797908 的回复:

Quote: 引用 12 楼 yenange 的回复:

用普通表吧, 你可以参考这篇博客: http://blog.csdn.net/yenange/article/details/58135245
作业步骤:
1. 清空目标表;
2. 同步表;
3. 生成报表。


你这个作业是在 A 中已有的物理表,我这边的情况是 从 A中多表查询出的结果


一样的, 导入导出向导可以是物理表, 也可以是一个查询, 比你想象的灵活。
跨服务器跨数据库查询制作报表
跨服务器跨数据库查询制作报表

我们做过一些测试, 导入导出向导在速度和稳定性方面控制得非常好。



哦哦, 用的不多, 还在撸代码当中,过两天测试下  跨服务器跨数据库查询制作报表

#17


引用 16 楼 u011797908 的回复:
哦哦, 用的不多, 还在撸代码当中,过两天测试下  跨服务器跨数据库查询制作报表


嗯嗯, 你的数据量也不算大, 写程序或用作业都可以, 区别不大吧。 

没事就结贴吧

#18


引用 17 楼 yenange 的回复:
Quote: 引用 16 楼 u011797908 的回复:

哦哦, 用的不多, 还在撸代码当中,过两天测试下  跨服务器跨数据库查询制作报表


嗯嗯, 你的数据量也不算大, 写程序或用作业都可以, 区别不大吧。 

没事就结贴吧


跨服务器跨数据库查询制作报表

最近刚做到同步这一块,从A服务器上的db定时同步数据到B服务器上的db,  之前写同步脚本是用链接服务器, 现按照你的方法,做成导入 SSIS包, 也用到了链接服务器,但提示报错?不知大神有无其它更优的解决方案?

#19


按提示应该是没有建立对应名称的链接服务器。

如果你觉得太复杂就用程序吧,  跨服务器跨数据库查询制作报表

#20


引用 19 楼 yenange 的回复:
按提示应该是没有建立对应名称的链接服务器。

如果你觉得太复杂就用程序吧,  跨服务器跨数据库查询制作报表


周末还这么快就回复我了,赞! 新建一个查询窗口,测试这个服务器链接, 是没有问题的, 放入到导入导出向导中的自定义脚本里就有问题, 而且我删除链接,重新新建也不行

我倒是很想用用 SSIS 包 + 作业 实现这个功能 !!! 

#21


你创建链接服务器的过程不要放到作业脚本里啊!
创建好了, 作业里面直接调用就是了

#22


引用 21 楼 yenange 的回复:
你创建链接服务器的过程不要放到作业脚本里啊!
创建好了, 作业里面直接调用就是了


我也这么认为的, 最开始我就是这么做的,就是报这个错,我才在这里加 链接服务器的

跨服务器跨数据库查询制作报表

#23





引用 21 楼 yenange 的回复:
你创建链接服务器的过程不要放到作业脚本里啊!
创建好了, 作业里面直接调用就是了
跨服务器跨数据库查询制作报表

我有点怀疑, 导入导出SSIS包是不是不能用 链接服务器 跨服务器跨数据库查询制作报表

#24


在B服务器上,一句话搞定
select * into tableB from Openrowset('sqloledb','hosta';'sa';'xxxx','select * from Tablea')
既然无实时性要求,每天晚上跑一下

#25


引用 24 楼 yisuylm 的回复:
在B服务器上,一句话搞定
select * into tableB from Openrowset('sqloledb','hosta';'sa';'xxxx','select * from Tablea')
既然无实时性要求,每天晚上跑一下


要倒的表少的话,我也倒也要用这种方式 , 简单省事, 关键是有3,40张表,导入数据的脚本都写了 700多行, 所以想用个安逸点的方法

#26


没人来了吗?再加10分  跨服务器跨数据库查询制作报表
不行的用用作业分步解决了!