SQL Server に、Web サービスから取り込まれたテーブルがあります。定期的に更新してほしい。SQL Merge 操作に似たものが欲しいです。
つまり、ソース (Web サービス) とターゲット (SQL テーブル) を定義し、ソースから欠落しているターゲットと一致するものを処理する方法を定義します。
テーブルにDescriptionとDeletedの 2 つのフィールドしかなく、Web サービスがDescriptionのみを提供するシナリオを考えてみましょう。
テーブルと Web サービスの両方に説明がある場合は、更新した (または更新しなかった) だけです。
説明がWebサービスに存在するがテーブルに存在しない場合、挿入したい
説明が Web サーバーに存在しなくなった場合は、削除済み = true としてマークします。
私が現在持っているものは次のとおりです。
public class WebServiceResults: AbstractOperation
{
public WebServiceResults()
{
var WebService = new WebService();
WSResults = WebService.GetResults();
}
IEnumerable<WSResult> WSResults { get; set; }
public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
{
foreach(var obj in WSResults)
yield return Row.FromObject(obj);
}
}
class SQLTableResults : AbstractOperation
{
public SQLTableResults()
{
SQLResults = data.MyTable.Select(x=>new {x.Description,x.Deletet});
}
Data data = new Data();
IEnumerable<SQLResult> SQLResults { get; set; }
public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
{
foreach (var obj in SQLResults)
yield return Row.FromObject(obj);
}
}
public override void Dispose()
{
data.Dispose();
base.Dispose();
}
}
class JoinTables : JoinOperation
{
protected override Row MergeRows(Row leftRow, Row rightRow)
{
Row row = leftRow.Clone();
row["Description2"] = rightRow["Description"];
return row;
}
protected override void SetupJoinConditions()
{
FullOuterJoin
.Left("Description")
.Right("Description");
}
}
class MergeTables : AbstractOperation
{
Data data = new Data();
public MergeTables()
{ }
public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
{
foreach (var obj in rows)
{
if (String.IsNullOrEmpty((string)obj["Description2"]))
{
//Code for not matched at target
yield return Row.FromObject(obj);
}
if (String.IsNullOrEmpty((string)obj["Description"]))
{
//Code for not matched at source
yield return Row.FromObject(obj);
}
{
//Code for matched
yield return Row.FromObject(obj);
}
}
}
public override void Dispose()
{
data.Dispose();
base.Dispose();
}
}
protected override void Initialize()
{
Register(
new JoinTables()
.Left(new SQLTableResults())
.Right(new WebServiceResults())
);
Register(new MergeTables());
foreach (var error in GetAllErrors())
Console.Write(error.Message);
}
これは行く方法ですか?次のような段階的なプロセスをもっと想像します
Register(new NotMatchedAtSourceOperation());
Register(new NotMatchedAtTargetOperation());
Register(new MatchedOperation());
しかし、私が理解しているように、各レジスタはその行を次の行に返すため、一致しないものをフィルタリングすると、他の2つは何もしません。
ケースごとに新しいプロセスを作成する必要がありますか?
ところで、RhinoEtl に関するドキュメントを探しています。リンクを知っていますか?チュートリアルはありますか?