Exercice langage SQL corrigé les fonctions (Part I)

Créer le Code pour la Fonction SQL permettant d’extraire le suffixe d’une chaine de charactères.

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
ALTER FUNCTION  dbo.Fx_RenvoieSuffixe (@CHAINEDONNEE AS VARCHAR(500), @SEPARATEUR AS VARCHAR(50))
RETURNS VARCHAR(500)
BEGIN
 
-- Déclare les variables locales
DECLARE @Result VARCHAR(500)
DECLARE @IndexSeparateur INT
 
-- Assigne les chaines d'origine sans les blancs possibles
SET @Result = RTRIM(LTRIM(@CHAINEDONNEE))
SET @SEPARATEUR = RTRIM(LTRIM(@SEPARATEUR))
 
-- Recherche si le séparateur existe dans la chaine donnée
SET @IndexSeparateur = CHARINDEX (@SEPARATEUR, @Result)
 
IF @IndexSeparateur > 0
-- Si le séparateur existe je fourni tout ce qui est après cette chaine
    SELECT @Result = SUBSTRING(@Result, CHARINDEX (@SEPARATEUR, @Result)+LEN(@SEPARATEUR), LEN(@Result)- CHARINDEX(\ , @Result))
ELSE
    SELECT @Result = @Result
 
-- Renvoi le résultat
RETURN @Result
 
END

Créer la Fonction d’ajout d’une durée (Année, Mois, Jour, Heure, Minute, Seconde) à une date.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
 
CREATE  FUNCTION [dbo].[AddDateTimeDuree] (@Dt Datetime, @an int=0, @mois int=0, @jour int=0,@heure int=0, @minute int=0, @seconde int=0) 
RETURNS DateTime AS 
BEGIN
 
    DECLARE @Ret Datetime
 
    IF @Dt IS NULL
        SET @Ret = NULL
    ELSE
        SET @Ret =  dateadd(second,isnull(@seconde,0),dateadd(minute,isnull(@minute,0),dateadd(hour,isnull(@heure,0),dateadd(day, isnull(@jour,0), dateadd(month, isnull(@mois,0), dateadd(year, isnull(@an,0), @Dt))))))
 
    RETURN @Ret
END
 
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

Créer une fonction qui permet de retrouver la position du premier chiffre d’une chaine.

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
39
40
41
42
43
44
45
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
 
CREATE FUNCTION [dbo].[FN_CHARINDEX_FIRST_NUMERIC] (@NOMDIV nvarchar(30))
RETURNS smallint
 
AS
 
BEGIN
 
    DECLARE @nom nvarchar(30)
    DECLARE @i smallint
    DECLARE @j smallint
    SET @i = 1
    SET @j = 0
 
    WHILE @i < len(@nomdiv)
    BEGIN
        DECLARE @car nvarchar(1)
        SET @car = (SUBSTRING(@NOMDIV, @i, @i) )
        IF @car IN ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')
        BEGIN
            SET @j = @i
            BREAK
        END
        ELSE
            SET @i = @i + 1
    END
 
RETURN @j
END
 
-- Ou Bien :
 
CREATE FUNCTION [dbo].[FN_CHARINDEX_FIRST_NUMERIC_V2] (@NOMDIV nvarchar(30))
RETURNS smallint
 
AS
 
BEGIN
 
  RETURN PATINDEX ('%[0123456789]%', @NOMDIV)
 
END

Télécharger aussi :

Laisser un commentaire

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

Besoin d'aide ?