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?
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
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