Y a-t-il un moyen plus intelligent d'éliminer tous les caractères spéciaux plutôt que d'avoir une série d'environ 15 relevés de remplacement imbriqués?
Les œuvres suivantes, mais ne gère que trois caractères (ampersand, vierge et période). p>
5 Réponses :
une voie flexible-ish;
Je vois que tout le monde recommande des fonctions. J'aime l'idée d'utiliser une fonction définie par l'utilisateur, mais il doit ensuite passer à travers le contrôle de changement pour accéder à l'environnement de production. Il n'y a aucun moyen d'avoir une fonction en ligne dans la requête, est là? Je ne sais pas dans quelle langue ils utilisent pour appeler la requête SQL, peut-être VBScript ou PowerShell, mais maintenant je pense que cela sera beaucoup plus facile de faire le décapage dans cette langue.
Comme une table de table ou de calendrier de chiffres, ou des fonctions qui divisent ou concaténent des chaînes, une fonction pouvant faire ce type de chose est un module pratique pour avoir autour. Même si cela n'arrive pas immédiatement, vous devriez envisager d'avoir ces éléments dans une base de données utilitaire. Je ne sais pas que l'exécution de cela dans le code est toujours la meilleure réponse soit, surtout si plusieurs applications différentes doivent faire la même chose ...
@Alex K., j'aime mieux cette solution que la mienne. Je n'ai jamais aimé avoir à examiner la chaîne un personnage à la fois. Avez-vous un moyen de remplacer les espaces supplémentaires et les caractères spéciaux (CR / LF, TAB)?
Si quiconque cherche à inclure uniquement l'alphanumérique, vous pouvez simplement l'utiliser comme modèle avec la fonction ci-dessus: '% [^ A-Z0-9]%'
J'ai fait face à ce problème il y a plusieurs années, j'ai donc écrit une fonction SQL pour faire le tour. Voici l'article original (a été utilisé pour Grattez le texte de HTML). J'ai depuis mis à jour la fonction, comme suit:
IF (object_id('dbo.fn_CleanString') IS NOT NULL) BEGIN PRINT 'Dropping: dbo.fn_CleanString' DROP function dbo.fn_CleanString END GO PRINT 'Creating: dbo.fn_CleanString' GO CREATE FUNCTION dbo.fn_CleanString ( @string varchar(8000) ) returns varchar(8000) AS BEGIN --------------------------------------------------------------------------------------------------- -- Title: CleanString -- Date Created: March 26, 2011 -- Author: William McEvoy -- -- Description: This function removes special ascii characters from a string. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- declare @char char(1), @len int, @count int, @newstring varchar(8000), @replacement char(1) select @count = 1, @len = 0, @newstring = '', @replacement = ' ' --------------------------------------------------------------------------------------------------- -- M A I N P R O C E S S I N G --------------------------------------------------------------------------------------------------- -- Remove Backspace characters select @string = replace(@string,char(8),@replacement) -- Remove Tabs select @string = replace(@string,char(9),@replacement) -- Remove line feed select @string = replace(@string,char(10),@replacement) -- Remove carriage return select @string = replace(@string,char(13),@replacement) -- Condense multiple spaces into a single space -- This works by changing all double spaces to be OX where O = a space, and X = a special character -- then all occurrences of XO are changed to O, -- then all occurrences of X are changed to nothing, leaving just the O which is actually a single space select @string = replace(replace(replace(ltrim(rtrim(@string)),' ', ' ' + char(7)),char(7)+' ',''),char(7),'') -- Parse each character, remove non alpha-numeric select @len = len(@string) WHILE (@count <= @len) BEGIN -- Examine the character select @char = substring(@string,@count,1) IF (@char like '[a-z]') or (@char like '[A-Z]') or (@char like '[0-9]') select @newstring = @newstring + @char ELSE select @newstring = @newstring + @replacement select @count = @count + 1 END return @newstring END GO IF (object_id('dbo.fn_CleanString') IS NOT NULL) PRINT 'Function created.' ELSE PRINT 'Function NOT created.' GO
J'aime l'idée d'utiliser une fonction définie par l'utilisateur, mais il doit ensuite passer à travers le contrôle de changement pour accéder à l'environnement de production.
Créer une fonction:
r ------ Bobsdog1friendaredopeyo
@Brian s'il vous plaît ne modifiez pas le code des autres personnes sans leur donner une idée de ce que "n'a pas fonctionné" signifie. Si vous avez un problème avec le code, laissez un commentaire, vous ne le modifiez pas. Je ne sais pas pourquoi votre édition a travaillé et l'original "N'a pas travaillé" mais Je n'écrirais jamais de code comme celui-là .
Vous avez raison Aaron, en regardant de la sorte, c'était très impoli et je serais sûrement très ennuyé si j'étais aussi vous aussi. Je me suis précipité grand temps et je m'excuse. Donc, au point que j'essayais de faire sans utiliser mes mots, @c n'est pas défini dans votre code, de sorte que cela ne fonctionne pas du tout. Je pense que j'avais atteint un type de structure charret que d'autres langues ont ... Je n'en ai besoin que de la première fonction, mais la deuxième partie est probablement touchée. Merci pour le code, cela m'a sauvé un peu de temps. :)
Je vois que vous l'avez corrigé en éliminant @c. Merci.
@Brian Oui, une fois que vous a expliqué i>, j'ai compris votre édition. Avant alors je n'ai pas honnêtement pas. Veuillez commencer par des commentaires avant d'éditer le code.
Entendu. ;) Nous sommes tous très protecteurs de notre travail, bien que dans mon cas, tout ce qui soit écrit aussi loin que 2012, j'aimerais pouvoir effacer entièrement parce que j'ai tellement appris depuis que ... j'imagine que ce sera toujours aussi. Je m'excuse à nouveau d'être indélicates. Merci.
Je sais que c'est un vieux fil, mais toujours, pourrait être pratique pour les autres. Voici un rapide et sale (que j'ai fait inversement - dépouiller les non-numériques) - en utilisant un CTE récursif. Ce qui rend celui-ci agréable pour moi, c'est que c'est une fonction inline - se déplace donc autour de l'effet Nasty Rbar des fonctions habituelles du scalaire et de la table. Ajustez votre filtre selon que nécessaire pour inclure ou exclure tous les types de caractères.
Create Function fncV1_iStripAlphasFromData ( @iString Varchar(max) ) Returns Table With Schemabinding As Return( with RawData as ( Select @iString as iString ) , Anchor as ( Select Case(IsNumeric (substring(iString, 1, 1))) when 1 then substring(iString, 1, 1) else '' End as oString, 2 as CharPos from RawData UNION ALL Select a.oString + Case(IsNumeric (substring(@iString, a.CharPos, 1))) when 1 then substring(@iString, a.CharPos, 1) else '' End, a.CharPos + 1 from RawData r Inner Join Anchor a on a.CharPos <= len(rtrim(ltrim(@iString))) ) Select top 1 oString from Anchor order by CharPos Desc ) Go select * from dbo.fncV1_iStripAlphasFromData ('00000') select * from dbo.fncV1_iStripAlphasFromData ('00A00') select * from dbo.fncV1_iStripAlphasFromData ('12345ABC6789!&*0')