IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Comment inverser un nombre hexadécimal en SQL ?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut Comment inverser un nombre hexadécimal en SQL ?
    Bonjour,
    J'ai en bdd un champs totoID de type varbinary(24). Ce champs provient d'un id utilisé dans un applicatif lambda du marché.
    Dans cet applicatif, il vaut en décimal 987456123, ce chiffre converti en hexadécimal vaut 0x3ADB627B
    Mais il est stocké en base en inversant, par groupe de 2 tous les chiffres, la représentation de totoID est donc 0x7B62DB3A
    J'arrive à transformer 987456123 en hexadécimal en SQL comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    declare @ki varbinary(24)
    select @ki=987456123
    select @ki--0x3ADB627B
    Mais je ne sais pas en SQL comment transformer @ki de 0x3ADB627B à 0x7B62DB3A, sauriez-vous faire cela s'il vous plaît ?
    L'idée est que je puisse ensuite faire des requêtes du type : select * from titi where totoID = @ki.
    Merci pour le retour,

  2. #2
    Membre Expert Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Par défaut
    Bonjour,
    En tapant "rearrange hexadecimal string in t-sql" sur goo*gle, et regarder le premier lien ?

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 175
    Par défaut
    Ca m'a l'air compliqué en SQL Server. Dans Oracle tu as juste à faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regexp_replace('0x3ADB627B', '^0x([[:alnum:]]{2})([[:alnum:]]{2})([[:alnum:]]{2})([[:alnum:]]{2})$', '0x\4\3\2\1')

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Une possibilité, a adapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     DECLARE @BIN VARBINARY(8) = 0x3ADB627B;
     DECLARE @Source INT = CAST(@BIN AS INT)
     
    SELECT  CAST((@Source & 0xFF) * 16777216
    + (@Source & 0xFF00) * 256
    + (@Source & 0xFF0000) / 256
    + (@Source & 0xFF000000) / 0x1000000 AS VARBINARY(8))
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    En suivant le conseil de vttman :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare @ki varbinary(24);
    select @ki=987456123;
    select cast(@ki as varbinary(24))
         , cast(reverse(cast(@ki as varbinary(24))) as varbinary(24));
     
    0x3ADB627B	0x7B62DB3A

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    Pour information, ta solution Waldar, prend un peu moins de temps que la mienne... Démo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET STATISTICS TIME ON;
    GO
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH 
    T0 AS (SELECT CAST(ABS(CHECKSUM(NEWID())) AS VARBINARY(4)) AS HEX, 1 AS ID
           UNION ALL
           SELECT CAST(ABS(CHECKSUM(NEWID())) AS VARBINARY(4)) AS HEX, ID + 1
           FROM   T0
           WHERE  ID < 100000
    )
    SELECT  HEX,
            CAST((CAST(HEX AS BIGINT) & 0xFF) * 16777216
               + (CAST(HEX AS BIGINT) & 0xFF00) * 256
               + (CAST(HEX AS BIGINT) & 0xFF0000) / 256
               + (CAST(HEX AS BIGINT) & 0xFF000000) / 0x1000000 AS BINARY(4)) AS XEH
    FROM T0
    OPTION(maxrecursion 0);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH 
    T0 AS (SELECT CAST(ABS(CHECKSUM(NEWID())) AS VARBINARY(4)) AS HEX, 1 AS ID
           UNION ALL
           SELECT CAST(ABS(CHECKSUM(NEWID())) AS VARBINARY(4)) AS HEX, ID + 1
           FROM   T0
           WHERE  ID < 100000
    )
    select HEX, cast(reverse(cast(HEX as varbinary(24))) as varbinary(24))
    FROM   T0
    OPTION (maxrecursion 0);
    Sur mon p'tit portable :

    (100000*lignes affectées)
    SQL Server \endash Temps d'exécution*: Temps UC = 1484*ms, temps écoulé = 1814*ms.

    (100000*lignes affectées)
    SQL Server \endash Temps d'exécution*: Temps UC = 1266*ms, temps écoulé = 1599*ms.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Par défaut
    Citation Envoyé par Waldar Voir le message
    En suivant le conseil de vttman :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare @ki varbinary(24);
    select @ki=987456123;
    select cast(@ki as varbinary(24))
         , cast(reverse(cast(@ki as varbinary(24))) as varbinary(24));
     
    0x3ADB627B	0x7B62DB3A
    Alors c'est génial, ça marche merci ! Mais... je ne comprends pas pourquoi... Pourquoi le reverse ici inverse bien 2 par 2 ? Comme on peut le voir ici https://www.sqlservertutorial.net/sq...erse-function/ reverse inverse chaque caractère normalement. J'imagine que cela a à voir avec le fait que dans mon lien c'est une string alors qu'ici on est avec du varbinary, c'est ça ? Est-ce que vous pourriez expliquer la différence de fonctionnement du coup ?

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Ca m'a l'air compliqué en SQL Server. Dans Oracle tu as juste à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select utl_raw.reverse(HEXTORAW('3ADB627B')) from dual ; -- result is RAW
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select rawtohex(utl_raw.reverse(HEXTORAW('3ADB627B'))) from dual ; -- result is VARCHAR2

Discussions similaires

  1. Réponses: 11
    Dernier message: 21/12/2010, 14h22
  2. Comment compter le nombre de lettre identique ?
    Par divableue dans le forum ASP
    Réponses: 3
    Dernier message: 07/11/2003, 15h01
  3. Nombre aléatoire en SQL
    Par sqlnet dans le forum Langage SQL
    Réponses: 8
    Dernier message: 19/08/2003, 12h38
  4. comment connaitre le nombre ...
    Par mythtvtalk.com dans le forum Requêtes
    Réponses: 9
    Dernier message: 04/08/2003, 08h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo