Question

Quelqu'un connaît-il un bon moyen de supprimer la ponctuation d'un champ dans SQL Server?

je pense

UPDATE tblMyTable SET FieldName = REPLACE(REPLACE(REPLACE(FieldName,',',''),'.',''),'''' ,'')

mais cela semble un peu fastidieux lorsque je compte supprimer un grand nombre de caractères différents, par exemple:! @ # #%% ^ & amp; * () < >: quot;

Merci d'avance

Était-ce utile?

La solution

Idéalement, vous le feriez dans un langage d'application tel que C # + LINQ, comme mentionné ci-dessus.

Si vous souhaitez le faire uniquement dans T-SQL, vous pouvez tout d’abord créer un tableau contenant toutes les ponctuations que vous souhaitez supprimer.

CREATE TABLE Punctuation 
(
    Symbol VARCHAR(1) NOT NULL
)

INSERT INTO Punctuation (Symbol) VALUES('''')
INSERT INTO Punctuation (Symbol) VALUES('-')
INSERT INTO Punctuation (Symbol) VALUES('.')

Ensuite, vous pouvez créer une fonction en SQL pour supprimer tous les symboles de ponctuation d'une chaîne d'entrée.

CREATE FUNCTION dbo.fn_RemovePunctuation
(
    @InputString VARCHAR(500)
)
RETURNS VARCHAR(500)
AS
BEGIN
    SELECT
        @InputString = REPLACE(@InputString, P.Symbol, '')
    FROM 
        Punctuation P

    RETURN @InputString
END
GO

Ensuite, vous pouvez simplement appeler la fonction dans votre instruction UPDATE

UPDATE tblMyTable SET FieldName = dbo.fn_RemovePunctuation(FieldName)

Autres conseils

Je voulais éviter de créer un tableau et je voulais tout supprimer, sauf les lettres et les chiffres.

DECLARE @p int
DECLARE @Result Varchar(250)
DECLARE @BadChars Varchar(12)
SELECT @BadChars = '%[^a-z0-9]%'
-- to leave spaces - SELECT @BadChars = '%[^a-z0-9] %'

SET @Result = @InStr

SET @P =PatIndex(@BadChars,@Result)
WHILE @p > 0 BEGIN
    SELECT @Result = Left(@Result,@p-1) + Substring(@Result,@p+1,250)
    SET @P =PatIndex(@BadChars,@Result)
    END

Je propose 2 solutions

Solution 1: créez une table de bruit et remplacez les bruits par des espaces vides

par exemple

DECLARE @String VARCHAR(MAX)
DECLARE @Noise TABLE(Noise VARCHAR(100),ReplaceChars VARCHAR(10))
SET @String = 'hello! how * > are % u (: . I am ok :). Oh nice!'

INSERT INTO @Noise(Noise,ReplaceChars)
SELECT '!',SPACE(1) UNION ALL SELECT '@',SPACE(1) UNION ALL
SELECT '#',SPACE(1) UNION ALL SELECT '$',SPACE(1) UNION ALL
SELECT '%',SPACE(1) UNION ALL SELECT '^',SPACE(1) UNION ALL
SELECT '&',SPACE(1) UNION ALL SELECT '*',SPACE(1) UNION ALL
SELECT '(',SPACE(1) UNION ALL SELECT ')',SPACE(1) UNION ALL
SELECT '{',SPACE(1) UNION ALL SELECT '}',SPACE(1) UNION ALL
SELECT '<',SPACE(1) UNION ALL SELECT '>',SPACE(1) UNION ALL
SELECT ':',SPACE(1)

SELECT @String = REPLACE(@String, Noise, ReplaceChars) FROM @Noise
SELECT @String Data

Solution 2: avec une table numérique

DECLARE @String VARCHAR(MAX)
SET @String = 'hello! & how * > are % u (: . I am ok :). Oh nice!'

;with numbercte as
(
 select 1 as rn
 union all
 select rn+1 from numbercte where rn<LEN(@String)
)
select REPLACE(FilteredData,'&#x20;',SPACE(1)) Data from 
(select SUBSTRING(@String,rn,1) 
from numbercte  
where SUBSTRING(@String,rn,1) not in('!','*','>','<','%','(',')',':','!','&','@','#','$')

for xml path(''))X(FilteredData)

Sortie (les deux cas)

Données

hello  how   are  u  . I am ok . Oh nice

Remarque: je viens de mettre quelques-uns des bruits. Vous devrez peut-être mettre les bruits dont vous avez besoin.

J'espère que cela vous aidera

Vous pouvez utiliser des expressions régulières dans SQL Server. Voici un article basé sur SQL 2005:

http://msdn.microsoft.com/en-us/magazine /cc163473.aspx

Je l'envelopperais dans un fichier UDF scalaire simple afin que tout le nettoyage des chaînes se fasse au même endroit si nécessaire.

Ensuite, vous pouvez aussi l'utiliser sur INSERT ...

S'il s'agit d'une opération ponctuelle, j'utiliserais un extrait de code C # + LINQ dans LINQPad faire le travail avec des expressions régulières.

C’est simple et rapide et vous n’aurez pas à suivre le processus de configuration d’une procédure stockée CLR, puis de le nettoyer après vous-même.

Ne pouvez-vous pas utiliser PATINDEX pour n’inclure que NUMBERS et LETTER au lieu d’essayer de deviner la ponctuation possible sur le terrain? (Je n'essaie pas d'être sournois, si j'avais le code prêt, je le partagerais ... mais c'est ce que je cherche.)

Il semble que vous deviez créer une fonction personnalisée afin d'éviter une liste géante de fonctions de remplacement dans vos requêtes. En voici un bon exemple:

http://www.codeproject.com/KB/database/ SQLPhoneNumbersPart_2.aspx? Display = Imprimer

J'ai pris la solution de Ken MC et l'ai transformée en une fonction qui peut remplacer toute ponctuation par une chaîne donnée:

----------------------------------------------------------------------------------------------------------------
-- This function replaces all punctuation in the given string with the "replaceWith" string
----------------------------------------------------------------------------------------------------------------
IF object_id('[dbo].[fnReplacePunctuation]') IS NOT NULL
BEGIN
    DROP FUNCTION [dbo].[fnReplacePunctuation];
END;
GO
CREATE FUNCTION [dbo].[fnReplacePunctuation] (@string NVARCHAR(MAX), @replaceWith NVARCHAR(max))
RETURNS NVARCHAR(MAX)
BEGIN
    DECLARE @Result Varchar(max) = @string;
    DECLARE @BadChars Varchar(12) = '%[^a-z0-9]%'; -- to leave spaces - SELECT @BadChars = '%[^a-z0-9] %'
    DECLARE @p int = PatIndex(@BadChars,@Result);
    DECLARE @searchFrom INT;
    DECLARE @indexOfPunct INT = @p;

    WHILE @indexOfPunct > 0 BEGIN
      SET @searchFrom = LEN(@Result) - @p;
      SET @Result = Left(@Result, @p-1) + @replaceWith + Substring(@Result, @p+1,LEN(@Result));
      SET @IndexOfPunct = PatIndex(@BadChars, substring(@Result, (LEN(@Result) - @SearchFrom)+1, LEN(@Result)));
      SET @p = (LEN(@Result) - @searchFrom) + @indexOfPunct;
    END
    RETURN @Result;
END;
GO
-- example:
SELECT dbo.fnReplacePunctuation('This is, only, a tést-really..', '');

Sortie:

Thisisonlyatéstreally
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top