web-dev-qa-db-fra.com

Comment puis-je supprimer des caractères non numériques d'une chaîne?

Les utilisateurs entrent un terme de recherche dans une boîte, et cette valeur est transmise à une procédure stockée et vérifiée par rapport à quelques champs différents dans la base de données. Ces champs ne sont pas toujours du même type de données.

Un champ (numéro de téléphone) se compose de tous les numéros, donc lors de la vérification, il supprime tous les caractères non numériques de la chaîne à l'aide d'une fonction .Net CLR.

SELECT dbo.RegexReplace('(123)123-4567', '[^0-9]', '')

Le problème est que cette fonction cesse brusquement de fonctionner à l'occasion avec l'erreur suivante:

 Msg 6533, niveau 16, état 49, ligne 2 
 AppDomain MyDBName.dbo [runtime] .1575 a été déchargé par la stratégie d'escalade pour garantir la cohérence 
 De votre application. Une mémoire insuffisante s'est produite lors de l'accès à une ressource critique. 
 System.Threading.ThreadAbortException: Une exception de type 
 'System.Threading.ThreadAbortException' a été levée. 
 System.Threading.ThreadAbortException: 

J'ai essayé les suggestions publiées sur MSDN pour cette erreur, mais j'ai toujours le problème. Pour le moment, le passage à un serveur 64 bits n'est pas une option pour nous.

Je sais que le redémarrage du serveur libère la mémoire qu'il contient, mais ce n'est pas une solution viable dans un environnement de production.

Existe-t-il un moyen de supprimer des caractères non numériques d'une chaîne dans SQL Server 2005 à l'aide de T-SQL uniquement?

10
Rachel

J'ai trouvé cette fonction T-SQL on SO qui fonctionne pour supprimer les caractères non numériques d'une chaîne.

CREATE Function [fnRemoveNonNumericCharacters](@strText VARCHAR(1000))
RETURNS VARCHAR(1000)
AS
BEGIN
    WHILE PATINDEX('%[^0-9]%', @strText) > 0
    BEGIN
        SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '')
    END
    RETURN @strText
END
14
Rachel

Je suis assez confiant dans cette solution. Je ne suis pas certain de la performance mais tout avis sur cette approche est vraiment le bienvenu! Fondamentalement, pour chaque caractère de la chaîne @String si la valeur ASCII du caractère se situe entre les valeurs ASCII de "0" et "9", conservez-la) , sinon remplacez-le par un blanc.

CREATE FUNCTION [dbo].[fnStripNonNumerics](
             @String VARCHAR(500))
RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE
          @n INT = 1,
          @Return VARCHAR(100) = ''

    WHILE @n <= LEN(@String)
       BEGIN
          SET @Return = @Return + CASE
                             WHEN ASCII(SUBSTRING(@String, @n, 1)) BETWEEN ASCII('0') AND ASCII('9')
                                THEN SUBSTRING(@String, @n, 1)
                                ELSE ''
                             END
          SET @n = @n + 1
       END

    RETURN CASE
         WHEN @Return = ''
            THEN NULL
            ELSE @Return
         END
END
0
mateoc15