private void TransferData(Table t, Guid? primaryKey) { StringBuilder sql = new StringBuilder(); var cols = string.Join(", ", GetColumnList(t.Name)); if (HasIdentityColumn(t.Name)) { SetIdentityInsertOn(t.Name); } var pkCol = GetPrimaryKeyColumn(t.Name); sql.AppendLine(string.Format("insert into [{0}]..[{1}] with(tablock) ({2})", to, t.Name, cols)); sql.AppendLine(string.Format("select {0}", cols)); sql.AppendLine(string.Format("from [{0}]..[{1}] a", from, t.Name)); sql.AppendLine("where 1=1"); if (primaryKey.HasValue) { sql.AppendLine(string.Format("and {0} = '{1}'", pkCol, primaryKey.Value)); } if (t.References.Any()) { bool first = true; sql.AppendLine("and ("); foreach(var r in t.References) { if (!first) { sql.AppendLine("OR"); } sql.AppendLine("exists("); sql.AppendLine("select 1"); sql.AppendLine(string.Format("from [{0}]..[{1}] _a", to, r.ForeignTable.Name)); sql.AppendLine(string.Format("where _a.{0} = a.{1}", r.ForeignColumnName, r.ColumnName)); sql.AppendLine(")"); } sql.AppendLine(")"); } if(pkCol != null) { sql.AppendLine("and not exists("); sql.AppendLine("select 1"); sql.AppendLine(string.Format("from [{0}]..[{1}] _a", to, t.Name)); sql.AppendLine(string.Format("where _a.{0} = a.{0}", pkCol)); sql.AppendLine(")"); } RunSQL(sql.ToString(), to); if (HasIdentityColumn(t.Name)) { SetIdentityInsertOff(t.Name); } }
private void Map(Table t) { if (!Tables.ContainsKey(t.Name)) { Tables.Add(t.Name, t); } foreach (var r in GetReferences(t.Name)) { Map(Tables[r]); } }