Bonjour,
Je voudrais convertir un hexadécimal stockée en varchar vers un type numeric.
Comment faire?
Merci d'avance.
Bonjour,
Je voudrais convertir un hexadécimal stockée en varchar vers un type numeric.
Comment faire?
Merci d'avance.
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 :
Et pour créer la contrainte de domaine :
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
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 ALTER TABLE dbo.maTable ADD CONSTRAINT maContrainte CHECK (dbo.udf_Check_Hexadecimal(maColonne) = 1)
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
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
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.
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))
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![]()
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
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
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];
++
Partager