如何将数据从 SQL Server 传输到 Informix,反之亦然
Posted
技术标签:
【中文标题】如何将数据从 SQL Server 传输到 Informix,反之亦然【英文标题】:How to transfer data from SQL Server to Informix and vice versa 【发布时间】:2015-08-25 16:09:26 【问题描述】:我想将表格数据从SQL server
传输到Informix
,反之亦然。
传输应按计划运行,有时应在用户执行特定操作时运行。
我通过delete and insert transactions
执行此操作,在15 minute to 30 minute
之间通过网络需要很长时间。
考虑到performance
,如何简单地执行此操作?
说我有
SQL Server 中的Vacation
表,并希望将所有更新的数据传输到 Informix 中的Vacation
表。
和
Informix 中的Permission
表,并希望将所有更新的数据传输到 SQL Server 中的Permission
表。
【问题讨论】:
按照您的要求,我已经看过了。我这辈子都没有接触过 SQL Server;我对在它和 Informix 之间传输数据一无所知。对不起,我不能再帮忙了。请在阅读后将此评论标记为“已过时”。 @JonathanLeffler:非常感谢,但我已经成功地将数据从SQL Server
表写入csv file
现在您能帮我将此文件中的数据加载到@987654333 中的等效表吗@通过存储过程因为我在存储过程中使用LOAD
命令时出现语法错误
@JonathanLeffler :这正是我在***.com/q/32586186/418343 中需要你帮助的部分,它涉及informix
。
【参考方案1】:
免责声明:我不是 SQL Server DBA。不过,我已经担任 Informix DBA 十多年了,可以就其性能提出一些建议。
抛开免责声明不谈,听起来您已经有了一个功能性应用程序,但性能却是个噱头,而这正是您主要寻求建议的地方。
了解一些有助于了解的技术信息,但如果没有它们,我将对您的环境和应用程序做出以下假设。如果我对其中任何一个有误,请评论或编辑您的问题。
-
数据库服务器版本。从标签看来,您使用的是 SQL Server 2012。但是,我无法确定 Informix 服务器和版本。我假设您至少运行 IDS 11.50 或更高版本。
当前如何交换数据。您是否直接从 .NET 应用程序连接到 Informix?我会假设 SQL Server 就是这种情况,并且也会对您的 Informix 连接做出相同的假设。
表结构。我假设您在表格上有适当的索引。在 Informix 方面,
dbschema -d *dbname* -t *tablename*
将提供基本模式。
如果您尚未尝试将数据导出为 CSV,并且只要您这样做没有任何合规性问题,我建议您从逗号分隔的文件中加载数据。 (Informix 通常处理以管道分隔的文件,因此您需要将 SQL Server 端的分隔符调整为管道 |
或 Informix 导入端)。在 Informix 端,这将是一个
LOAD FROM 'source_file_from_sql_server' DELIMITER '|' INSERT INTO vacation (field1, field2, ..)
为了可重用性,我建议将其放入存储过程中。只需将该加载语句包装在 BEGIN WORK;
和 COMMIT WORK;
中,以保持您的事务完整性。 Michał Niklas 建议了一些跟踪更改的方法。如果将数据传输到 Informix 中的假期表和返回 SQL Server 中的权限表之间存在任何关联,我会建议另一种选择,即向vacation
表添加触发器,以便将所有新值写入临时表。
使用存储过程中的导入逻辑,您可以按需触发导入:
EXECUTE PROCEDURE vacation_import();
您还提到需要安排导入,这可以通过 Informix 的“dbcron”来完成。使用此功能,您将创建一个定期执行vacation_import()
的计划任务。如果您以前没有使用过此功能,使用OAT 会有所帮助。您还需要对 CSV 文件进行一些整理。这可以通过 system()
调用来解决,您可以通过 Informix 中的存储过程进行调用。
【讨论】:
informix服务器版本是:IBM Informix Dynamic Server Version 12.10.FC3
你能解释一下如何把'source_file_from_sql_server'
,如何生成这样的文件以及如何读取它。?
source_file_from_sql_server
只是来自 SQL Server 的 CSV。这是一个示例:***.com/a/425463/5260945。将 CSV 从一个数据库服务器获取到另一个实际上取决于您的网络 - 可以通过共享文件系统。 “读取”它的一部分将完全由 Informix DB 使用存储过程处理,我称之为 vacation_import
。
谢谢,但还是有点困惑,你的意思是'source_file_from_sql_server'
是从SQL Server 生成的CSV 的路径吗?从informix到sql server的反面呢?
对不起,您是正确的。 source_file_from_sql_server
是从 SQL Server 生成的 CSV 的完整路径。对于需要反馈到 SQL Server 的数据,您可以遵循相同的模式。您可能希望将传出数据(Informix -> SQL Server)转储到与传入数据(SQL Server -> Informix)不同的目录中。我从未讨论过如何在 SQL Server 上触发导入,这在很大程度上取决于两个数据库系统的连接方式。
你是对的——我没有意识到这个限制。但是,由于您使用的是最新版本的 Informix,加载外部数据的另一种方法是将 CSV 文件映射到 EXTERNAL TABLE
,然后使用 MERGE
命令处理更新/插入。请参阅 Jonathan Leffler 对 SO 上类似问题的回答:***.com/a/20665293/5260945。他是 Informix 的绝对专家,他的解决方案似乎也非常适用于您的用例。【参考方案2】:
一些想法:
将was_transferred
列添加到源表,将其默认值设置为0
(您可以使用0/1
而不是false/true
)。
从源表中选择带有was_transferred=0
的数据。
在传输数据更新选定的源行后,将其was_transferred
设置为1
。
使用date_start
和date_stop
等字段创建表syncro_info
。如果您发现有date_stop IS NULL
的记录,则表示您正在传输数据。这将防止您两次同步数据。
【讨论】:
以上是关于如何将数据从 SQL Server 传输到 Informix,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章
将架构从 SQL Server 数据库传输到 SQL Server CE 数据库的简单方法?
SQL Server:将数据从一个表传输到另一个 [内存分配失败]
将数据从 Advantage 数据库服务器传输到 SQL Server