Способ # 1
Первый способ - заменить лишние пробелы между словами необычной комбинацией символов в качестве временного маркера. Затем вы можете заменить символы временных маркеров, используя функцию замены, а не цикл.
Вот пример кода, который заменяет текст в строковой переменной.
DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!';
SELECT REPLACE(REPLACE(REPLACE(@testString, ' ', '*^'), '^*', ''), '*^', ' ');
Тест времени выполнения №1: в десяти запусках этого метода замены среднее время ожидания ответов сервера составило 1,7 миллисекунды, а общее время выполнения - 4,6 миллисекунды. Тест времени выполнения № 2: Среднее время ожидания ответов сервера составляло 1,7 миллисекунды, а общее время выполнения - 3,7 миллисекунды.
Способ # 2
Второй метод не так элегантен, как первый, но также выполняет свою работу. Этот метод работает путем вложения четырех (или, возможно, более) операторов замены, которые заменяют два пробела одним пробелом.
DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!';
SELECT REPLACE(REPLACE(REPLACE(REPLACE(@testString,' ',' '),' ',' '),' ',' '),' ',' ')
Тест времени выполнения №1: в десяти запусках этого метода замены среднее время ожидания ответов сервера составило 1,9 миллисекунды, а общее время выполнения - 3,8 миллисекунды. Тест времени выполнения № 2: Среднее время ожидания ответов сервера составляло 1,8 миллисекунды, а общее время выполнения - 4,8 миллисекунды.
Способ # 3
Третий метод замены лишних пробелов между словами - использование простого цикла. Вы можете проверить лишние пробелы в цикле while, а затем использовать функцию replace, чтобы уменьшить лишние пробелы при каждой итерации цикла.
DECLARE @testString AS VARCHAR(256) = ' Test text with random* spacing. Please normalize this spacing!';
WHILE CHARINDEX(' ',@testString) > 0
SET @testString = REPLACE(@testString, ' ', ' ')
SELECT @testString
Тест времени выполнения №1: в десяти запусках этого метода замены среднее время ожидания ответов сервера составило 1,8 миллисекунды, а общее время выполнения - 3,4 миллисекунды. Тест времени выполнения № 2: Среднее время ожидания ответов сервера составляло 1,9 миллисекунды, а общее время выполнения - 2,8 миллисекунды.