SQL Server Comparer des arrays similaires avec une requête

Concept simple, nous effectuons un peu d'audit, comparons ce qui est arrivé et ce qui s'est réellement passé pendant le traitement. Je suis à la search d'une meilleure façon d'exécuter une requête qui peut faire des comparaisons côte à côte avec des colonnes qui diffèrent légèrement dans le nom et le type de potentiy.

Disposition de la database:

Table (* est la condition de jointure)

Log (logging de données non modifié)
– LogID
– RecordID *
– Prénom
– Rendez-vous amoureux
– Adresse
– Des produits
– etc.

Audit (logging de post-traitement)
– CardID *
– CarName
– DeploymentDate
– Adresse de livraison
– Options
– etc.

Par exemple, cela fonctionnerait si vous regardez au-delà de la complexité ennuyeuse à écrire, et des problèmes de performance.

La requête rejoint juste la gauche et la droite et les sélectionne comme des strings. Affichage de chaque champ correspondant.

select cast(log.RecordID as varchar(40)) + '=' + cast(audit.CardID as varchar(40), log.Name+ '=' + audit.Name , cast(log.Date as varchar(40)) + '=' + cast(audit.DeploymentDate as varchar(40), log.Address + '=' + audit.ShippingAddress, log.Products+ '=' + audit.Options --etc from Audit audit, Log log where audit.CardID=log.RecordId 

Ce qui produirait quelque chose comme:

1 = 1 Test = TestName 11/09/2009 = 11/10/2009 null = Mon adresse null = Roues

Cela fonctionne mais est extrêmement ennuyeux à build. Une autre chose à laquelle je pensais était de simplement alias les colonnes, d'unir les deux tables, et de les ordonner pour qu'elles soient sous forme de list. Cela me permettrait de voir les comparaisons de colonnes. Cela vient avec les frais généraux évidents de l'union tous.

c'est à dire:

Log 1 Test 11/09/2009 null, null
Audit 1 TestName 11/10/2009 Mon adresse Roues

Des suggestions sur une meilleure façon de vérifier ces données?

Faites-moi savoir quelles autres questions vous pourriez avoir.

Notes complémentaires. Nous allons vouloir réduire les informations sans importance, donc dans certains cas, nous pourrions annuler la colonne si elles sont égales (mais je sais que c'est trop lent)

  case when log.[Name]<>audit.[CarName] then (log.[Name] + '!=' + audit.[CarName]) else null end 

ou si nous faisons la deuxième

  nullif(log.[Name], audit.[CarName]) as [Name] ,nullif(audit.[CarName], log.[Name]) as [Name] 

J'ai trouvé que la routine donnée ici par Jeff Smith était utile pour faire des comparaisons de tables dans le passé. Cela pourrait au less vous donner une bonne base de départ. Le code donné sur ce lien est:

 CREATE PROCEDURE CompareTables(@table1 varchar(100), @table2 Varchar(100), @T1ColumnList varchar(1000), @T2ColumnList varchar(1000) = '') AS -- Table1, Table2 are the tables or views to compare. -- T1ColumnList is the list of columns to compare, from table1. -- Just list them comma-separated, like in a GROUP BY clause. -- If T2ColumnList is not specified, it is assumed to be the same -- as T1ColumnList. Otherwise, list the columns of Table2 in -- the same order as the columns in table1 that you wish to compare. -- -- The result is all records from either table that do NOT match -- the other table, along with which table the record is from. declare @SQL varchar(8000); IF @t2ColumnList = '' SET @T2ColumnList = @T1ColumnList set @SQL = 'SELECT ''' + @table1 + ''' AS TableName, ' + @t1ColumnList + ' FROM ' + @Table1 + ' UNION ALL SELECT ''' + @table2 + ''' As TableName, ' + @t2ColumnList + ' FROM ' + @Table2 set @SQL = 'SELECT Max(TableName) as TableName, ' + @t1ColumnList + ' FROM (' + @SQL + ') A GROUP BY ' + @t1ColumnList + ' HAVING COUNT(*) = 1' exec ( @SQL) 

Quelque chose comme ça fonctionnerait pour vous:

 select (Case when log.RecordID = audit.CardID THEN 1 else 0) as RecordIdEqual, (Case when log.Name = audit.Name THEN 1 else 0) as NamesEqual , (Case when log.Date = audit.DeploymentDate THEN 1 else 0) as DatesEqual, (Case when log.Address = audit.ShippingAddress THEN 1 else 0) as AddressEqual, (Case when log.Products = audit.Options THEN 1 else 0) as ProductsEqual --etc from Audit audit, Log log where audit.CardID=log.RecordId 

Cela vous donnera une ventilation de ce qui est égal basé sur le nom de la colonne. On dirait que cela pourrait être plus facile que de faire tout le casting et d'avoir à interpréter la string qui en résulte …