Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Supprimer caractere speciaux


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Supprimer caractere speciaux
    Bonjour à tous,

    je voudrais savoir si il est possible dans une requête (SELECT) sur un champs de remplacer les caractères spéciaux.

    (Uniquement caractère Lettre et chiffre et les caractère spéciaux remplacer par un espace ou un tiret)

    Est-ce réalisable ? Avec un expression Reg?

    Merci d'avance pour vos explications

    guigui69

  2. #2
    Expert éminent sénior
    Hello,

    La fonction T-SQL suivante devrait faire l'affaire:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR ALTER FUNCTION [DBO].[DropSpecialCharacters] (@InputString NVARCHAR(MAX)) 
    RETURNS NVARCHAR(MAX) 
    AS 
    BEGIN 
        WHILE PATINDEX('%[^0-9a-zA-Z]%', @InputString) <> 0 
        BEGIN 
            SET @InputString = STUFF(@InputString, PATINDEX('%[^0-9a-zA-Z]%', 
                                                    @InputString),1, '') 
        END 
     
        RETURN @InputString 
    END
    GO


    Exemple:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    DECLARE @t TABLE (
    	col1 VARCHAR(50)
    );
     
    INSERT @t VALUES ('ABC;-:.<>-_DGH>-ghublkjfdslkfd_:dèpQw_');
    INSERT @t VALUES ('$éàfs_4èp404o5^64é$àt_ät_:');
     
    SELECT 
    	col1,
    	dbo.DropSpecialCharacters(col1)
    FROM @t
     
    --	col1										(No column name)
    --	ABC;-:.<>-_DGH>-ghublkjfdslkfd_:dèpQw_		ABCDGHghublkjfdslkfddèpQw
    --	$éàfs_4èp404o5^64é$àt_ät_:					éàfs4èp404o564éàtät


    ++

  3. #3
    Membre du Club
    Bonjour mikedavem,

    merci pour votre réponses je connaissait pas PATINDEX

    Si je veux rajouter le critère de filtre et de caractere de remplacement en me basant sur votre Function

    Est-ce que ce si est correcte?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    CREATE OR ALTER FUNCTION [DBO].[DropSpecialCharacters] 
    (
    @InputString NVARCHAR(MAX)
    @ExpressionReg VARCHAR(255)
    @caractereremplacement VARCHAR(4)
    ) 
    RETURNS NVARCHAR(MAX) 
    AS 
    BEGIN 
     
       SET @ExpressionReg =  '%['+@ExpressionReg +']%'
    SET @caractereremplacement =  'caractereremplacement'
        WHILE PATINDEX(ExpressionReg , @InputString) <> 0 
        BEGIN 
            SET @InputString = STUFF(@InputString, PATINDEX(ExpressionReg , @InputString),1, caractereremplacement ) 
        END 
     
        RETURN @InputString 
    END
    GO


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT 
    	col1,
    	dbo.DropSpecialCharacters(col1,'^0-9a-zA-Z',' ')


    merci par avance pour votre retour et votre aide

    guigui69

  4. #4
    Expert éminent sénior
    Oui c'est possible.

    Par contre fais bien attention à ce que l'expression de remplacement ne vienne pas interférer avec celle qu'il faut remplacer.
    En effet si tu remplaces un caractère par un autre qui doit être lui même remplacé tu vas partir dans une boucle infinie.

    Dans l'exemple que tu donnes c'est le cas (ou peut être qu'il y a eu une erreur de frappe). Tu remplaces un caractère non alpha numérique par un espace, ce qui va induire une boucle infinie puisque lui même n'est pas alpha numérique.

    Il faudrait faire cela dans ton cas:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT 
    	col1,
    	dbo.DropSpecialCharacters(col1,'^0-9a-zA-Z','')


    ++

  5. #5
    Membre du Club
    Bonjour,

    Merci pour votre retour et votre d'information sur la boucle infini

    je suis entrain de faire un test, par contre si il y a une apostrophe/ une quote il doit le supprimer normalement?

    guigui69

  6. #6
    Membre du Club
    Bonjour,

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR ALTER FUNCTION [DBO].[DropSpecialCharacters] (@InputString NVARCHAR(MAX)) 
    RETURNS NVARCHAR(MAX) 
    AS 
    BEGIN 
        WHILE PATINDEX('%[^ 0-9a-zA-Z]%', @InputString) <> 0 
        BEGIN 
            SET @InputString = STUFF(@InputString, PATINDEX('%[^ 0-9a-zA-Z]%',@InputString),1, '') 
        END 
     
        RETURN @InputString 
    END
    GO


    j'ai rajouté un espace entre le chapeaux et le 0 pour autoriser l'espace, dans les deux ligne patindex Est-ce que c'est bon?

  7. #7
    Rédacteur

    Tu peut simplifier ceci :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    PATINDEX('%[^0-9a-zA-Z]%'


    par cela :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    PATINDEX('%[^0-9a-z]%' COLLATE French_CI_AI


    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

###raw>template_hook.ano_emploi###