7
votes

Comparer deux tables T-SQL pour diffs

J'ai deux instances de la même base de données. La première dB représente des données d'aujourd'hui, les deuxièmes données de 6 mois. J'ai besoin de trouver des différences pour un sous-ensemble d'entrées dans une table spécifique.

Pour les entrées avec ID qui sont dans les deux tables, j'aimerais trouver un moyen d'afficher uniquement les rangées qui ne sont pas identiques.

Des idées?

merci


1 commentaires

Qu'est-ce qui est avec la demande de fermeture?


6 Réponses :


2
votes

Vous pouvez utiliser l'utilitaire Tablediff.exe fourni avec SQL Server 2005 et supérieur.

Vous pouvez En savoir plus ici .


1 commentaires

C'est tout un outil impressionnant. J'espérais cependant que quelque chose peut être fait dans le code T-SQL.



6
votes
EXEC compareTables 'db1_name','dbo.table1','db2_name','dbo.table1'

8 commentaires

Oui, j'avais peur de dire ça.


N'oubliez pas de tester pour NULL


Pas bon? Plus d'exigences? Dis juste, tout peut être fait ici à la fois ;-)


Les tables sont assez grandes alors je suppose que cela ne fonctionnera pas très bien. J'espérais une sorte de fonction avancée pouvant avoir des rangées de hachage ou quelque chose. C'est cependant une solution utilisable et je vous remercie pour cela.


Vous pouvez générer cette grosse instruction à l'aide de Dynamic SQL. Donnez-moi quelques minutes, peut-être que je vais produire quelque chose.


J'ai ajouté SP pour générer une déclaration pour vous.


C'est presque correct, mais pas complètement. NULL et '' sont des valeurs différentes, et votre isnull (T1.Field1, '') ne fait pas la distinction entre eux


Voici une suggestion de prendre des valeurs NOT_NULLABLES et numériques (tableaux dans la même database ici, ajoutez db1 et db2 si nécessaire): sélectionnez @where = (AT) Où + cas lorsque IST_NULLABLE = 0. T1. + Nom + '<> T2.' + nom + 'ou' quand précision = 0 puis 'isnull (T1.' + nom + ',' '' ') <> isnull (T2.' + nom + ',' '' T1. '+ nom +', -99999999999999999999999999999999999999999999999999999999) ou 'Fin de Sys.Columns où Object_id = Object_id (((((AT) Tablef) (je n'ai pas été autorisé à utiliser Plus d'une variable @, étant donné que les noms d'utilisateur. Désolé pour le (at): s.)



2
votes

pour SQL Server 2005 et plus Essayez quelque chose comme ceci: xxx

sortie xxx

si SQL Server 2000 ou plus Essayez quelque chose comme Ceci: xxx


0 commentaires

4
votes

De votre texte, je pense que vous dites qu'il y a une pièce d'identité pouvant être utilisée pour assortir des rangées. xxx

non testé, mais devrait fonctionner.


3 commentaires

Binaire_checksum ne permet pas le symbole Asterisk "" pour tous les champs. Je reçois une "syntaxe incorrecte près de" '"[astérisque] en 2008r2. Cela aurait été une très belle comparaison, si cela avait fonctionné.


TechEt.microsoft.com/en-us/Library /ms173784(V=SQL.105).aspx dit qu'il est pris en charge en 2008R2. Y a-t-il un autre problème avec la requête peut-être?


Vous avez raison: l'astérisque est autorisé, mais les noms de table ne sont évidemment pas autorisés. Je suppose que le binaire_checksum avec (astérisque) génère une somme de contrôle pour tous les champs, c'est-à-dire pour les tables jointes combinées. Voir Stackoverflow.com/questions/9038338/...



0
votes

Juste pour que vous sachiez, vous pouvez également acheter un outil de tiers tiers que vous pouvez acheter pour faire ce genre de chose pour les bases de données SQL Server appelées SQL Data Comparer. Il est vendu par rouge-porte. http: //www.red-gate. com / produits / SQL_DATA_COMPARE / INDEX.HTM? GCLID = CKPP-6-BI50CFQRM5QODTWGL8G

Il y a un essai gratuit. Mais cela vaut la peine de dépenser l'argent pour.


1 commentaires

Il est seulement juste d'ajouter qu'il existe un certain nombre d'outils de comparaison de données ... (la porte rouge n'a pas été mon choix). Voici une liste mises à jour il y a quelques années: MSSQLTips.com/sqlServertiP / 1069 / SQL-Server-comparaison-outils



4
votes

Un peu en retard, mais:

SELECT *
 from Table1
intersect select *
 from Table2


0 commentaires