如何将数据从 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_startdate_stop 等字段创建表syncro_info。如果您发现有date_stop IS NULL 的记录,则表示您正在传输数据。这将防止您两次同步数据。

【讨论】:

以上是关于如何将数据从 SQL Server 传输到 Informix,反之亦然的主要内容,如果未能解决你的问题,请参考以下文章

将架构从 SQL Server 数据库传输到 SQL Server CE 数据库的简单方法?

SQL Server:将数据从一个表传输到另一个 [内存分配失败]

将数据从 Advantage 数据库服务器传输到 SQL Server

是否可以将数据从非常规数据库传输到 SQL Server

使用 SSIS 和 CData 从 Sql Server 到 Elasticsearch 的数据传输

如何使用 SSIS 将 OTM 中的数据提取到 SQL Server 中?