Une fonction d’extraction des nombres contenus dans une chaîne de caractères : les fonctions ISNUMERIC() et ASCII()

Voici une petite fonction qui vous permettra d’extraire les nombres contenus dans une chaîne de caractères, et de les retourner comme un entier…

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
---------------------------------
-- Nicolas SOUQUET - 09/06/2009 -
---------------------------------
CREATE FUNCTION dbo.FnTrouveChiffres(@string VARCHAR(1024))
  RETURNS INT
  WITH SCHEMABINDING
AS
BEGIN
  DECLARE @result VARCHAR(1024)
 
  IF ISNUMERIC(@string) = 1
  BEGIN
    SET @result = @string
  END
  ELSE
  BEGIN
    DECLARE @i INT,
        @Lgr INT,
        @char CHAR(1)
 
    SELECT @i = 1,
        @Lgr = LEN(@string),
        @result = ''
 
    WHILE @i <= @Lgr
    BEGIN
      SELECT @char = SUBSTRING(@string, @i, 1)
 
      IF ISNUMERIC(@char) = 1
      BEGIN
        SET @result = @result + @char
      END
   
      SET @i = @i + 1
    END
  END
  RETURN CAST(@result AS INT)
END

Vous pouvez utiliser cette fonction si vous êtes certain que votre chaîne ne contiendra jamais les symboles arithmétiques « + » et « -« .
En effet, la fonction ISNUMERIC() retourne 1 (vrai) pour ces deux symboles.

Il existe une autre solution avec la fonction ASCII() :

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
---------------------------------
-- Nicolas SOUQUET - 09/06/2009 -
---------------------------------
ALTER FUNCTION [dbo].[FnTrouveChiffres](@string VARCHAR(1024))
  RETURNS INT
  WITH SCHEMABINDING
AS
BEGIN
  DECLARE @result VARCHAR(1024)
 
  DECLARE @i INT,
      @Lgr INT,
      @char CHAR(1)
 
  SELECT @i = 1,
      @Lgr = LEN(@string),
      @result = ''
 
  WHILE @i <= @Lgr
  BEGIN
    SELECT @char = SUBSTRING(@string, @i, 1)
 
    IF ASCII(@char) BETWEEN 48 AND 57
    BEGIN
      SET @result = @result + @char
    END
 
    SET @i = @i + 1
  END
 
  RETURN CAST(@result AS INT)
END

ElSuket

Laisser un commentaire