77b65bea-e766-4e3c-a1ed-c4c2534b6019
true
D0001-SQL-11.sdt.local
jazz dev master Prod
true
<ProgramFilesX64>\Microsoft SDKs\Azure\.NET SDK\v2.9\bin\plugins\Diagnostics\Newtonsoft.Json.dll
Amazon.Lambda.S3Events
AWSSDK.Core
AWSSDK.S3
Amazon
Amazon.Auth.AccessControlPolicy
Amazon.Auth.AccessControlPolicy.ActionIdentifiers
Amazon.Internal
Amazon.Lambda.S3Events
Amazon.MissingTypes
Amazon.Runtime
Amazon.Runtime.CredentialManagement
Amazon.Runtime.CredentialManagement.Internal
Amazon.Runtime.EventStreams
Amazon.Runtime.EventStreams.Internal
Amazon.Runtime.Internal
Amazon.Runtime.Internal.Auth
Amazon.Runtime.Internal.Settings
Amazon.Runtime.Internal.Transform
Amazon.Runtime.Internal.Util
Amazon.Runtime.SharedInterfaces
Amazon.Runtime.SharedInterfaces.Internal
Amazon.S3
Amazon.S3.Encryption
Amazon.S3.Encryption.Internal
Amazon.S3.Internal
Amazon.S3.IO
Amazon.S3.Model
Amazon.S3.Model.Internal.MarshallTransformations
Amazon.S3.Transfer
Amazon.S3.Util
Amazon.Util
Amazon.Util.Internal
Amazon.Util.Internal.PlatformServices
Newtonsoft.Json
Newtonsoft.Json.Converters
Newtonsoft.Json.Linq
Newtonsoft.Json.Schema
Newtonsoft.Json.Serialization
System
System.Diagnostics
System.Diagnostics.Tracing
System.IO.Compression
ThirdParty.BouncyCastle.Asn1
ThirdParty.BouncyCastle.Asn1.Utilities
ThirdParty.BouncyCastle.Math
ThirdParty.BouncyCastle.OpenSsl
ThirdParty.BouncyCastle.Utilities.IO.Pem
ThirdParty.Ionic.Zlib
ThirdParty.Json.LitJson
ThirdParty.MD5
private string tableQuery = @"SELECT c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE
, CAST(CASE WHEN ccu.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS BIT) IsPrimaryKey
FROM INFORMATION_SCHEMA.COLUMNS AS c
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc ON tc.TABLE_SCHEMA = c.TABLE_SCHEMA AND tc.TABLE_NAME = c.TABLE_NAME
LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu ON ccu.TABLE_SCHEMA = tc.TABLE_SCHEMA AND ccu.TABLE_NAME = tc.TABLE_NAME AND ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME AND ccu.COLUMN_NAME = c.COLUMN_NAME
WHERE c.TABLE_SCHEMA in ('stratasphere')
AND (CASE c.TABLE_SCHEMA
WHEN 'stratasphere' THEN 1
ELSE
CASE WHEN c.TABLE_NAME IN ('DimCaseType', 'CaseTypeFamily', 'CaseTypeFamilyMapping', 'CaseTypeFamilyMappingAPRDRG', 'CaseTypeFamilyMappingICD10', 'CaseTypeFamilyMappingCPT', 'CaseTypeFamilyVersion')
THEN 1 ELSE 0 END END = 1)
AND c.DATA_TYPE NOT IN ('datetime','uniqueidentifier', 'timestamp')
AND NOT (c.COLUMN_NAME = 'RowID' and CAST(CASE WHEN ccu.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS BIT) = 1)
AND tc.CONSTRAINT_TYPE = 'Primary Key'
ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION";
private List OrderByStatements;
private List ColumnsToBeExcluded;
void Main()
{
OrderByStatements = new List
{
new OrderByInformation{
TableName = "cci.InitiativeWorkflowHistory",
OrderBy = "\r\nOrder By OBJ.FromStep, OBJ.ToStep"
},
new OrderByInformation{
TableName = "cci.VariationEncounterSavingInfo",
OrderBy = "\r\nOrder By OBJ.EncounterRecordNumber, OBJ.PhysicianID"
},
new OrderByInformation{
TableName = "stratasphere.MDXScoreToCube",
OrderBy = "\r\nOrder By OBJ.OrgPin, OBJ.ScoreDimensionName, ScoreHierarchyName"
}
};
ColumnsToBeExcluded = new List {
new ColumnsToExclude{
TableName = "stratasphere.MDXScoreToCube",
ColumnNames = new [] {"DateCreated", "DateLastModified"}
}
};
var conn = new Tuple("D0011-SQL-01.sdt.local", "stratasphere");
var q = GetQueries(conn);
var connections = new ServerInstance[] {
new ServerInstance("D0011-SQL-01.sdt.local","stratasphere", q.Select(r => r.TableName).ToArray()),
new ServerInstance("E0001-SQL-11.sdt.local", "stratasphere", q.Select(r => r.TableName).ToArray() )
}.ToList();
var sql = string.Join("\r\n", q.Select(r => r.SqlSelect));
var dataLegacy = GetData(connections[0], sql);
var dataUpdate = GetData(connections[1], sql);
foreach (var dt in Enumerable.Range(0, dataLegacy.Tables.Count))
{
var legacy = dataLegacy.Tables[dt].Rows;
var update = dataUpdate.Tables[dt].Rows;
var idxCount = legacy.Count;
var compare = new List>();
foreach (var row in Enumerable.Range(0, idxCount))
{
var r = legacy[row];
if (row < update.Count)
{
var u = update[row];
var rJson = JsonConvert.SerializeObject(r.ItemArray);
var uJson = JsonConvert.SerializeObject(u.ItemArray);
if (rJson != uJson)
{
compare.Add(new Tuple(r, u));
}
}
else
{
compare.Add(new Tuple(r, null));
}
}
if (compare.Any())
{
compare.Dump(dataLegacy.Tables[dt].TableName, 2);
}
else
{
"No differences found in data".Dump(dataLegacy.Tables[dt].TableName);
}
}
}
// Define other methods and classes here
public class ServerInstance
{
public string Server { get; set; }
public string Database { get; set; }
public IEnumerable TableNames { get; set; }
public ServerInstance(string server, string database, string[] tableNames)
{
Server = server;
Database = database;
TableNames = tableNames;
}
}
public class OrderByInformation
{
public string TableName { get; set; }
public string OrderBy { get; set; }
}
public class ColumnsToExclude
{
public string TableName { get; set; }
public IEnumerable ColumnNames { get; set; }
}
public List GetQueries(Tuple connection)
{
var server = connection.Item1;
var database = connection.Item2;
var sql = tableQuery;
var connStr = $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;";
using (var conn = new SqlConnection(connStr))
{
var dataset = new DataTable();
var adapter = new SqlDataAdapter(sql, conn);
adapter.Fill(dataset);
var items = dataset.AsEnumerable().Select(r => r).ToList().ConvertAll(r => r.ItemArray)
.Select(r => new InformationSchema { schema = (string)r[0], table = (string)r[1], column = (string)r[2], datatype = (string)r[3], isPrimaryKey = (bool)r[4] })
.Where(r => !ColumnsToBeExcluded.SingleOrDefault(ctbe => ctbe.TableName == r.schemaTable)?.ColumnNames.Contains(r.column) ?? true)
.GroupBy(r => new { r.schema, r.table }, (t, c) =>
new SqlInformation
{
TableName = $"{t.schema}.{t.table}",
SqlSelect = "Select\r\n" + c.Aggregate("", (x, y) => $"{x}, obj.{y.column}\r\n").Substring(1) + $" FROM {t.schema}.{t.table} OBJ"
+ OrderByStatements.SingleOrDefault(obs => obs.TableName.Equals($"{t.schema}.{t.table}", StringComparison.CurrentCultureIgnoreCase))?.OrderBy ?? ""
+ ";"
})
.ToList();
return items;
}
}
public class SqlInformation
{
public string TableName { get; set; }
public string SqlSelect { get; set; }
}
public class InformationSchema
{
public string schema { get; set; }
public string table { get; set; }
public string column { get; set; }
public string datatype { get; set; }
public bool isPrimaryKey { get; set; }
public string schemaTable => $"{schema}.{table}";
}
public DataSet GetData(ServerInstance serverInstance, string sql)
{
var server = serverInstance.Server;
var database = serverInstance.Database;
var connStr = $"data source={server};initial catalog='{database}';persist security info=True;Integrated Security=SSPI;";
using (var conn = new SqlConnection(connStr))
{
var dataset = new DataSet();
var adapter = new SqlDataAdapter(sql, conn);
adapter.Fill(dataset);
var tableNames = serverInstance.TableNames;
var idx = 0;
foreach (var tableName in tableNames)
{
dataset.Tables[idx].TableName = tableName;
idx += 1;
}
return dataset;
}
}