Obtenir les valeurs de hachage de SQL Server et Oracle et les comparer?

Est-il possible de générer du code de hachage à partir du server de database et de les comparer? Comment écrire le pseudo SQL suivant dans SQL Server? En particulier les deux fonctions getHash qui acceptent les colonnes numériques / float mutliple dans SQL Server et Oracle.

 select s.PK from sqltable s join openquery(oracleLinkedServer, 'select PK, getHash(Column1, floatColumn2, ..., floatColumnN) oracleHash from oracleTable') o on o.PK = s.PK where getHash(Column1, floatColumn2, ..., floatColumnN) <> oracleHash 

Dans SQL Server:

 select upper(subssortingng(sys.fn_sqlvarbasetostr(hashbytes('MD5','A')),3,32)); 

résultat:

 7FC56270E7A70FA81A5935B72EACBE29 

Dans Oracle:

 select rawtohex( DBMS_CRYPTO.Hash ( UTL_I18N.STRING_TO_RAW ('A', 'AL32UTF8'), 2) ) from dual; 

résultat:

 7FC56270E7A70FA81A5935B72EACBE29 

Assurez-vous que vos strings sont exactement les mêmes (sensibles à la casse). Ici, j'ai utilisé 'A' comme un exemple simple, mais ce pourrait être n'importe quelle string.

Si vous évitez les différences de type de données en convertissant en une grande string, vous devriez être capable de produire le même hachage MD5 sur différentes plates-forms. Notez que SQL Server a ajouté un '0x' au hachage pour indiquer la représentation hexadécimale, que j'ai effacée avec la sous-string.

Dans SQL Server, vous avez hashbytes () ; dans Oracle vous avez DBMS_CRYPTO.Hash () . Vous devriez être capable de les utiliser pour calculer un hachage MD5 des deux côtés, mais je ne suis pas sûr que les hachages vont correspondre … ça vaut le coup.

Il existe d'autres façons de comparer les tables, mais pour répondre à votre question, voici les deux fonctions natives de chaque plate-forme.

Vous pouvez utiliser CHECKSUM() dans SQL Server pour calculer un hachage multi-colonnes.