SQL Server : Fonction de conversion de Hexadécimal vers Décimal en Decimal(38,0)
Petit code qui m'a été utile dernièrement, le problème étant que SQL Server en cas de conversion cité plus haut vers un bigint par exemple utilise un entier signé, la conversion peut se relever fausse. De plus au-delà du Bigint ce n'est plus possible d'où l'idée d'écrire une fonction qui cible le plus grand type existant dans SQL Server decimal(38,0), soit 38 décimales, il faudra changer en fonction la taille de la chaine hexa entrante.
Ce n'est pas la plus efficace du monde étant donné que j'itère que calculer la puissance de 2, mais il se trouve que la fonction POWER de SQL perd en précision sur les grandes puissant, car il se base sur le type float.
ALTER
FUNCTION fn_hex2dec(@hexstr varchar(16))
RETURNS
decimal(38,0)
AS
BEGIN
DECLARE @i int = 0 ;
DECLARE @j int = 0 ;
DECLARE @hexval varchar(16)
=
REVERSE(RTRIM(LTRIM(UPPER(@hexstr))))
;
DECLARE @decval decimal(38,0)
= 0;
DECLARE @power decimal(38,0)
= 0;
IF @hexval LIKE
'%^[0123456789ABCDEF]%'
RETURN
NULL
;
DECLARE @hexstring char(16)
=
'0123456789ABCDEF';
WHILE @i < LEN(@hexval)
BEGIN
IF @i = 0
SET @power = 1;
ELSE
BEGIN
SET @j = 1 ;
SET @power = 16;
WHILE @j <= @i - 1
BEGIN
SET @power *= 16 ;
SET @j += 1 ;
END
END
SET @decval +=
CAST(CHARINDEX(SUBSTRING(@hexval, @i + 1, 1), @hexstring)
- 1 AS
decimal(38,0))
* @power ;
SET @i += 1 ;
END
RETURN @decval
END
Si vous trouvez mieux (En TSQL, EF refuse et .Net aussi) je suis preneur, en attendant si cette fonction peut être utile à quelqu'un.
Bonne fonction…
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :