RhinoETL - 将两个表作为输入连接,在输出时写入两个表

时间:2010-12-14 17:34:40

标签: c# sql rhino rhino-etl

我正在使用Rhino ETL

在c#中编写ETL作业

我在ServerA上有一个数据库。这有两个表:

(实施例)

tblOrder

  • 订单ID
  • 客户名称
  • CustomerEmailAddress
  • 转移

tblOrderLine

  • 订单ID
  • 的ProductID
  • 产品名称
  • 价格

在ServerB上,它有一个相同的表(订单从Web传输到我们的后端系统)

使用RhinoETL,我的InputCommandOperation目前看起来像:

class ReadOrdersFromWebDB : InputCommandOperation
{
    public ReadOrdersFromServerA(ConnectionStringSettings connectionStringSettings)
        : base(connectionStringSettings) { }

    protected override Row CreateRowFromReader(IDataReader reader)
    {
        return Row.FromReader(reader);
    }

    protected override void PrepareCommand(IDbCommand cmd)
    {
        cmd.CommandText = "SELECT TOP 10 * FROM tblOrders WHERE Transferred = 0";
    }
}

由于在此阶段没有转换,我的OutputCommandOperation将如下所示:

class WriteOrdersToServerB : OutputCommandOperation
{
    protected override void PrepareCommand(IDbCommand cmd, Row row)
    {
        cmd.CommandText =
@"INSERT INTO etc...........";
    }
}

我想要做的是修改此过程,从ServerA获取tblOrderLine详细信息 - 如果可能的话,不要在db(join)上执行秒查询 我很想避免在tblOrderLine表上有一个“Transferred”列,并且希望修改InputCommand以包含一个连接..

在InputCommand中加入后,插入操作如何工作? 这甚至可能吗?

1 个答案:

答案 0 :(得分:0)

我的理解是你有2个表,你希望从ServerA上传到ServerB,如果可能的话,将ServerA中的2个表合并在一起,然后再将它们拆分为ServerB中的2个表。

如果tblOrder和tblOrderLine之间的关系是1到多,那么就忘记加入它们。它将创建冗余数据,更不用说SELECT TOP n将导致tblOrderLine中的某些项被忽略。如果2个表之间的关系是1比1那么它是可能的,但我不确定它比单独查询2个表更有效。

您可以通过将从tblOrder中提取的OrderID保存到列表中,然后查询tblOrderLine来查找这些特定的OrderID,从而避免在tblOrderLine上使用Transferred标志。

SELECT TOP 10 * 
FROM tblOrder
WHERE Transferred = 0

保存此数据中找到的OrderID列表,并使用它查询tblOrderLine。

SELECT *
FROM tblOrderLine
WHERE OrderID IN /* list of saved OrderID */