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