我们最近将JD Edwards EnterpriseOne系统从AS400 / DB2平台转换为Windows& SQL Server。在旧系统中,我们有一个RPG / CL程序,它将数据从AS400库传输到会计系统进行进一步处理。最终用户需要启动此过程,以便通过菜单命令执行。
要在转换后复制此行为,我在SQL Server 2008 R2中创建了一个存储过程,该存储过程通过链接服务器从as400将记录插入SQL Server数据库,然后更新as400上的记录以指示记录已存在处理。为了让最终用户能够执行此过程,我创建了一个执行存储过程的SSRS(2005)报告。
当SSRS报告以交互方式执行时,我们间歇性地收到错误“出于安全原因,此XML文档中禁止DTD”,我的研究是由SSRS内存不足引起的。
有没有人知道传输数据的另一种/更好的方式?
存储过程的传输/更新基本上是
INSERT INTO [SQL DEST TABLE]
SELECT *
FROM [AS400 Linked Server/Table]
UPDATE OPENQUERY (AS400_LINK, 'MY SELECT QUERY')
SET FLAG = PROCESSED;
答案 0 :(得分:0)
您应该获得更好的数据库性能,允许服务器在可能的情况下使用自己的数据执行工作,而不是必须来回传输。
我会对情况做一些猜测,如果你纠正我,我会很乐意根据你的情况调整答案。这听起来像是从DB2中的记帐事务表中提取数据,并且完成后,您希望更新这些记录中的标志。这可能表明记录可能永远保留在该表中,或者可能是某些其他进程将其清除。 SELECT上没有WHERE,所以我认为它们会被删除。我将假设我们不知道是否可以随时将更多记录添加到事务表中,包括提取信息和更新标志之间的任何时间段。
我想知道你是否可以在提取之后立即更新标志,然后才真正处理SQL Server?这是否可以在后勤和业务要求范围内进行?
假设你......
所以在DB2中,#1可能看起来像
INSERT INTO workfile
SELECT *
FROM transactions
WHERE flag = unprocessed
在第3步中,SQL Server作业可能会将工作文件中的标志更新为错误状态,以防SQL Server无法正常处理的任何记录。
DB2上的第4步可能是
UPDATE transactions
SET flag = processed
WHERE transid IN (SELECT transid
FROM workfile
WHERE flag <> error
)
希望SQL Server上的处理错误相当少见。如果该进程更新工作文件中的事务,仅在出现错误时,这应该比为每次成功传输更新更快。上面的UPDATE语句应该能够在DB2上运行得更快,因为它是由同一服务器上的工作文件驱动的,而不是将数据传输回DB2。