Bonjour à tous,
Je travaille actuellement sur SSIS. Ma base source est sur Oracle et celle de destination est Sql Server.
J'essaie de faire un hash md5 pour comparer les données dans mon import dans SSIS.
En cherchant, j'ai trouvé cette formule pour slqServer
et pour Oracle
Code : Sélectionner tout - Visualiser dans une fenêtre à part select upper(substring(sys.fn_sqlvarbasetostr(hashbytes('MD5','A')),3,32));
ou ça qui donne la même chose
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 select rawtohex( DBMS_CRYPTO.Hash ( UTL_I18N.STRING_TO_RAW ('A', 'AL32UTF8'), 2) ) from dual;
En faisant des tests, je rencontre rapidement des différences.
Code : Sélectionner tout - Visualiser dans une fenêtre à part select DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_I18N.STRING_TO_RAW ('A')) from dual;
Sur le premier champs, j'ai bien la même chose des 2 côtés.
Mais dès que je concatène 2 champs (QTY et LIV_CODE pour le test), je ne trouve pas la même chose.
LIV_CODE étant null dans mon exemple, je décide de remplacer par une valeur au cas où Oracle et SqlServer ne gère pas les NULL de la même manière.
Ce qui est le plus incompréhensible pour moi, c’est lorsque je fais le test en corrigeant à la mano.
Autant sur Oracle, j’obtiens le même résultat. Sur Sql Server, j’ai 2 résultats différent pour , a priori, une valeur identique.
Ci-dessous l’exemple.
Voici le script sur Oracle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT cmd_id, lig_id, qty ,liv_code , DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_I18N.STRING_TO_RAW (qty||'|'|| nvl(liv_code,'X'))) H1 , DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_I18N.STRING_TO_RAW (qty||'|X')) H2 FROM TB_COMMANDES where cmd_id=2313970 and lig_id=857
cmd_id lig_id qty liv_code H1 H2 2313970 857 -1 CB8173CA768212AE770B6D9833ED2C74 CB8173CA768212AE770B6D9833ED2C74
et la requete sur Sql Server
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 SELECT [cmd_id] , [lig_id] , [qty] , [liv_code] , UPPER(SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', CONCAT([qty], '|', ISNULL([liv_code], 'X')))), 3, 32)) AS Hv1 , UPPER(SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5', CONCAT([qty], '|X'))), 3, 32)) Hv2 FROM [dbo].[TB_COMMANDES] WHERE cmd_id = 2313970 AND lig_id = 857;
cmd_id lig_id qty liv_code Hv1 Hv2 2313970 857 -1 NULL E53FEEE3565B1CCE325B2CF63504EA1B CB8173CA768212AE770B6D9833ED2C74
J'espère avoir été claire.
Si vous pourriez m’éclairer sur les subtilités de Sql Server, je vous en serai très reconnaissante 😊.
Merci d’avance.
Partager