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 :

Convertir un hexadecimal en numeric


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 148
    Par défaut Convertir un hexadecimal en numeric
    Bonjour,

    Je voudrais convertir un hexadécimal stockée en varchar vers un type numeric.

    Comment faire?

    Merci d'avance.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Il nous faut commencer par vérifier à l'insertion que nous avons une valeur hexadécimale valide.
    Pour cela nous pouvons écrire la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    CREATE FUNCTION udf_Check_Hexadecimal
    	(@_hexa VARCHAR(50))
    RETURNS BIT
    WITH SCHEMABINDING
    AS
    BEGIN 
    	DECLARE @i INT, 
    		@lgr INT, 
    		@char ASCII(1),
    		@ok BIT
     
    	SELECT @i = 1, 
    		@lgr = LEN(@_hexa),
    		@ok = 1
     
    	WHILE @i <= @lgr 
    	BEGIN
    	SELECT @ok = CASE 
    			WHEN ASCII(UPPER(SUBSTRING(@_hexa, @i, 1))) BETWEEN 48 AND 57 THEN 1 -- chiffres
    			WHEN ASCII(UPPER(SUBSTRING(@_hexa, @i, 1))) BETWEEN 65 AND 70 THEN 1 -- de A à F
    			ELSE 0
    		END
     
    		IF @ok = 0 
    		BEGIN
    			BREAK
    		END
     
    		SET @i = @i + 1
    END
    Et pour créer la contrainte de domaine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE dbo.maTable
    ADD CONSTRAINT maContrainte CHECK (dbo.udf_Check_Hexadecimal(maColonne) = 1)
    On peut ensuite envisager d'ajouter une colonne calculée à la table, ou bien de créer une vue, à partir de la fonction suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    CREATE FUNCTION Fn_Get_Decimal_From_Hexadecimal
    	(@_hexa VARCHAR(50))
    	RETURNS INT
    AS
    BEGIN
    	DECLARE @i INT, 
    		@lgr INT, 
    		@char CHAR(1),
    		@result INT
     
    	SELECT @i = 1, 
    		@lgr = LEN(@_hexa)
    		@result = 0
     
    	WHILE @i <= @lgr 
    	BEGIN
    		SELECT @result = @result +
    				CASE ASCII(UPPER(SUBSTRING(@_hexa, @i, 1)))
    					WHEN 48 THEN 0
    					WHEN 49 THEN 1
    					WHEN 50 THEN 2
    					WHEN 51 THEN 3
    					WHEN 52 THEN 4
    					WHEN 53 THEN 5
    					WHEN 54 THEN 6
    					WHEN 55 THEN 7
    					WHEN 56 THEN 8
    					WHEN 57 THEN 9
    					WHEN 65 THEN 10 -- A
    					WHEN 66 THEN 11 -- B
    					WHEN 67 THEN 12 -- C
    					WHEN 68 THEN 13 -- D
    					WHEN 69 THEN 14 -- E
    					WHEN 70 THEN 15 -- F
    				END
     
    		SET @i = @i + 1
    END
    Pour ajouter la colonne à la table source, il nous suffit d'écrire, après la création de cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE dbo.maTable
    ADD valeurDecimale AS(dbo.Fn_Get_Decimal_From_Hexadecimal(maColonneHexa))
    N'oubliez pas que vous pouvez ajouter à la fin de la requête ci-dessus les mots-clé NOT NULL et/ou PERSISTED, ce dernier mot vous permettant d'indexer les valeurs contenues dans cette nouvelle colonne.

    Si vous souhaitez créer une vue, vous pouvez par exemple vous passer de la valeur hexadécimale et ne montrer que la valeur décimale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE VIEW maVue
    	WITH SCHEMABINDING
    AS
    BEGIN
    	SELECT mesColonnesMaisPasMaColonneHexa,
    		dbo.Fn_Get_Decimal_From_Hexadecimal() AS valeurDecimale
    	FROM dbo.maTable
    END
    @++

  3. #3
    Membre confirmé
    Inscrit en
    Février 2004
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 148
    Par défaut
    Merci de ta réponse,

    Sinon j'ai trouvé cette fonction qui est bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Createfunction [dbo].[hex2int](@s varchar(16)) --Convert hex to 
    returns bigint -- e.g. select dbo.hex2int('7ff2a5')
    as begin
    select @s=upper(@s)
    declare @i int, @len int, @c char(1), @result bigint
    select @len=len(@s), @i=@len, @result=case when @len>0 then 0 end
    while (@i>0)
    begin
      select @c=substring(@s,@i,1), @result=@result
      +(ASCII(@c)
        -(case when @c between 'A' and 'F' then 55 
          else case when @c between '0' and '9' then 48 end
          end))
      *power(16.,@len-@i)
      ,@i=@i-1
    end -- while
    return @result
    end -- function

  4. #4
    Membre Expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Par défaut
    Cet article traite du sujet et propose une solution élégante pour convertir un nombre en base X vers du décimal:
    http://www.sqlmag.com/Articles/Artic...6016.html?Ad=1

  5. #5
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonsoir,

    Bon comme la version de SQL Server n'est pas précisée, je me permets de compléter la réponse à titre d'information

    Sur SQL Server 2008 avec les fonctionnalités apportés à la fonction CONVERT il est possible de convertir un hexadécimal en entier de façon simple.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE @hexastring VARCHAR(6) = '7ff2a5';
     
    SELECT 
    	CONVERT(INT,CONVERT(VARBINARY(5),'0x' + @hexastring,1), 2)AS [Char Hexa to Int],
    	CONVERT(INT,CONVERT(VARBINARY(5), @hexastring,2), 2)AS [Char Hexa to Int 2];
    ++
    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Convertir un varchar en numeric(5,2)
    Par tortuegenie dans le forum Développement
    Réponses: 1
    Dernier message: 17/03/2010, 10h08
  2. [SSIS] [2K8] Convertir une chaîne en numeric
    Par soft_bi dans le forum SSIS
    Réponses: 5
    Dernier message: 18/06/2009, 16h00
  3. Convertir un hexadecimal en decimal
    Par yann87 dans le forum Débuter
    Réponses: 6
    Dernier message: 24/09/2008, 12h40
  4. convertir en hexadecimal
    Par polianita dans le forum Langage
    Réponses: 4
    Dernier message: 22/02/2007, 18h54
  5. convertir du hexadecimal en texte
    Par cilies38 dans le forum JDBC
    Réponses: 1
    Dernier message: 22/02/2007, 10h12

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