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. P>
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. P>
Des idées? P>
merci p>
6 Réponses :
Vous pouvez utiliser l'utilitaire Tablediff.exe fourni avec SQL Server 2005 et supérieur. P>
Vous pouvez En savoir plus ici . P>
C'est tout un outil impressionnant. J'espérais cependant que quelque chose peut être fait dans le code T-SQL.
EXEC compareTables 'db1_name','dbo.table1','db2_name','dbo.table1'
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.)
pour SQL Server 2005 et plus Essayez quelque chose comme ceci: sortie p> si SQL Server 2000 ou plus Essayez quelque chose comme Ceci: p>
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. non testé, mais devrait fonctionner. p> p>
Binaire_checksum ne permet pas le symbole Asterisk "" pour tous les champs. Je reçois une "syntaxe incorrecte près de" i> '"[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 i> 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/...
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 P>
Il y a un essai gratuit. Mais cela vaut la peine de dépenser l'argent pour. p>
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
Un peu en retard, mais:
SELECT * from Table1 intersect select * from Table2
Qu'est-ce qui est avec la demande de fermeture?