SQL Server et la fonction ISNUMERIC

La fonction ISNUMERIC de SQL Server est particulièrement malicieuse, … surtout pour nous francophones.

En effet, la documentation Microsoft définie la chose suivante : « Lorsque la valeur 1 est retournée, ceci indique que l’expression peut être convertie au minimum en l’un des types numériques.

Les types numériques sont les suivants :

int numeric
bigint money
smallint smallmoney
tinyint float
decimal real

En fait, il faut bien avoir à l’esprit que les signes non purement numériques tels que +, -, ‘.’ ‘,’, $, … sont tous pris en compte. Dans la pratique, la fonction ISNUMERIC garantie que la valeur est convertible dans le type MONEY au format américain (la virgule pour séparateur de millier, même si la langue de l’utilisateur SQL Server est French).

 Ainsi le code suivant retourne une erreur :

DECLARE @test VARCHAR(10)
SET @test='$10,1'
IF ISNUMERIC(@test)=1 PRINT CONVERT(DECIMAL(18,0),@test)

La solution est de remplacer les virgules par des points, puis de faire une double conversion en passant par le type MONEY ainsi par exemple :

DECLARE @test VARCHAR(10)
SET @test='$10,1'
IF ISNUMERIC(@test)=1
  PRINT CONVERT(DECIMAL(18,0),CONVERT(MONEY,REPLACE(@test,',','.')))

Il peut donc être utile d’écrire une fonction de conversion de la sorte :

CREATE FUNCTION getNumeric(@str VARCHAR(50)) RETURNS MONEY
AS
BEGIN
  DECLARE @ret MONEY
  IF ISNUMERIC(@str)=1
    SELECT @ret=CONVERT(MONEY,REPLACE(@str,',','.'))
  RETURN @ret
END

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.