public string Run(ActionType compareType, TableName[] N1, TableName[] N2, ApplicationCommand cmd) { string[] exceptColumns = cmd.Columns; DatabaseName dname1 = Side1.DatabaseName; DatabaseName dname2 = Side2.DatabaseName; cout.WriteLine("server1: {0} default database:{1}", Side1.Provider.DataSource, dname1.Name); cout.WriteLine("server2: {0} default database:{1}", Side2.Provider.DataSource, dname2.Name); if (!Exists(dname1) || !Exists(dname2)) { return(string.Empty); } StringBuilder builder = new StringBuilder(); builder.AppendFormat("-- sqlcon:", Side1.Provider.DataSource, dname1.Name).AppendLine(); builder.AppendFormat("-- compare server={0} db={1}", Side1.Provider.DataSource, dname1.Name).AppendLine(); builder.AppendFormat("-- server={0} db={1} @ {2}", Side2.Provider.DataSource, dname2.Name, DateTime.Now).AppendLine(); Wildcard <TableName> match = MatchedDatabase.CreateWildcard(cmd); CancelableWork.CanCancel(cts => { int i = 0; foreach (var tname1 in N1) { if (cts.IsCancellationRequested) { return; } TableName tname2 = N2.Where(t => t.Name == tname1.Name).FirstOrDefault(); if (tname2 == null) { //when compare tables in the same database, the table name could be different if (i < N2.Length && N2[i].DatabaseName == tname1.DatabaseName) { tname2 = N2[i]; } else { tname2 = new TableName(dname2, tname1.SchemaName, tname1.Name); } } if (compareType == ActionType.CompareData && !match.Contains(tname1)) { cout.WriteLine("{0} is excluded", tname1); continue; } if (tname2.Exists()) { try { builder.Append(CompareTable(compareType, CompareSideType.compare, tname1, tname2, cmd.PK, exceptColumns)); } catch (Exception ex) { cerr.WriteLine(ex.Message); } } else { if (compareType == ActionType.CompareSchema) { string sql = tname1.GenerateCreateTableClause(appendGO: false); cout.WriteLine(sql); builder .Append(sql) .AppendLine(SqlScript.GO); } else { cout.WriteLine("{0} doesn't exist", tname2); } } i++; } }); return(builder.ToString()); }