-- remplacer tous les caractères non imprimables (dont : retour chariot, saut de ligne, tabulation...) par un blanc. -- 1) à l'aide d'une fonction CREATE OR ALTER FUNCTION F_REMOVE_UNPRINTABLE_CHARS_V1(@STRING NVARCHAR(max)) RETURNS NVARCHAR(max) AS BEGIN DECLARE @UNPRINTABLE_CHARS NCHAR(32) = N'', @I TINYINT = 0; WHILE @I < 31 BEGIN SET @UNPRINTABLE_CHARS = @UNPRINTABLE_CHARS + NCHAR(@I); SET @I = @I + 1; END RETURN TRANSLATE (@STRING, @UNPRINTABLE_CHARS, ' '); END; GO CREATE OR ALTER FUNCTION F_REMOVE_UNPRINTABLE_CHARS_V2(@STRING NVARCHAR(max)) RETURNS NVARCHAR(max) AS BEGIN DECLARE @STR_OUT NVARCHAR(MAX) = N'', @I INT = 1, @C NCHAR(1); WHILE @I < LEN(@STRING) BEGIN SET @C = SUBSTRING(@STRING, @I, 1); SET @STR_OUT = @STR_OUT + CASE WHEN UNICODE(@C) < 32 THEN N' ' ELSE @C END; SET @I = @I + 1; END RETURN @STR_OUT END; GO -- test basique : SELECT dbo.F_REMOVE_UNPRINTABLE_CHARS_V1('toto tata titi'); SELECT dbo.F_REMOVE_UNPRINTABLE_CHARS_V2('toto tata titi'); GO -- tests sur bonne volumétrie SET STATISTICS TIME ON; GO SELECT dbo.F_REMOVE_UNPRINTABLE_CHARS_V1(definition) FROM sys.sql_modules --> Temps UC = 22 922 ms, temps écoulé = 23 456 ms SELECT dbo.F_REMOVE_UNPRINTABLE_CHARS_V2(definition) FROM sys.sql_modules --> Temps UC = 92 157 ms, temps écoulé = 101 042 ms. GO CREATE OR ALTER FUNCTION F_REMOVE_DUPLICATE_SPACES_V1(@STRING NVARCHAR(max)) RETURNS NVARCHAR(max) AS BEGIN WHILE CHARINDEX(' ', @STRING) > 0 SET @STRING = REPLACE(@STRING, ' ', ' '); RETURN @STRING; END; GO CREATE OR ALTER FUNCTION F_REMOVE_DUPLICATE_SPACES_V2(@STRING NVARCHAR(max)) RETURNS NVARCHAR(max) AS BEGIN DECLARE @STR_OUT NVARCHAR(MAX) = N'', @I INT = 1, @C NCHAR(1), @SPACE BIT = 0; WHILE @I <= LEN(@STRING) BEGIN SET @C = SUBSTRING(@STRING, @I, 1); -- caractère trouvé espace et caractère précédent non espace IF @C = N' ' AND @SPACE = 0 BEGIN SET @STR_OUT = @STR_OUT + ' '; SET @SPACE = 1; END ELSE BEGIN -- caractère non espace et caractère précédemment espace IF @C <> N' ' AND @SPACE = 1 BEGIN SET @STR_OUT = @STR_OUT + @C; SET @SPACE = 0 END ELSE BEGIN -- caractère non espace et caractère précédemment non espace IF @C <> N' ' AND @SPACE = 0 SET @STR_OUT = @STR_OUT + @C; END; -- dernier cas : caractère espace et caractère précédent espace.... On ne fait rien ! END; SET @I = @I + 1; END RETURN @STR_OUT END; GO --> tests basiques : SELECT dbo.F_REMOVE_DUPLICATE_SPACES_V1(' toto titi tata ') SELECT dbo.F_REMOVE_DUPLICATE_SPACES_V2(' toto titi tata ') GO --> test sur bonne volumétrie SET STATISTICS TIME ON; GO SELECT dbo.F_REMOVE_DUPLICATE_SPACES_V1(definition) FROM sys.sql_modules --> Temps UC = 3 250 ms, temps écoulé = 3 607 ms SELECT dbo.F_REMOVE_DUPLICATE_SPACES_V2(definition) FROM sys.sql_modules --> Temps UC = 102 562 ms, temps écoulé = 116 270 ms.