Ведущие пробелы, конечные пробелы, два или более пробелов между соседними словами - это вероятные причины неверных результатов, которые вы получаете.
Функции LTRIM()
и RTRIM()
могут помочь вам устранитьпервые два вопроса.Что касается третьего, вы можете использовать REPLACE(ExtractedText, ' ', ' ')
для замены двойных пробелов на одиночные, но я не уверен, что у вас нет тройных (в этом случае вам нужно будет повторить замену).
ОБНОВЛЕНИЕ
Вот UDF, который использует CTE и ранжирование для устранения лишних пробелов, а затем считает оставшиесявернуть количество в виде количества слов:
CREATE FUNCTION fnCountWords (@Str varchar(max))
RETURNS int
AS BEGIN
DECLARE @xml xml, @res int;
SET @Str = RTRIM(LTRIM(@Str));
WITH split AS (
SELECT
idx = number,
chr = SUBSTRING(@Str, number, 1)
FROM master..spt_values
WHERE type = 'P'
AND number BETWEEN 1 AND LEN(@Str)
),
ranked AS (
SELECT
idx,
chr,
rnk = idx - ROW_NUMBER() OVER (PARTITION BY chr ORDER BY idx)
FROM split
)
SELECT @res = COUNT(DISTINCT rnk) + 1
FROM ranked
WHERE chr = ' ';
RETURN @res;
END
С помощью этой функции ваш запрос будет выглядеть следующим образом:
SELECT fnCountWords(ExtractedText)
FROM EDDSDBO.Document
WHERE ID='100'
ОБНОВЛЕНИЕ 2
Функция использует одну из системных таблиц master..spt_values
в качестве таблицы подсчета.Конкретное используемое подмножество содержит только значения от 0 до 2047. Это означает, что функция не будет работать правильно для вводов, длина которых превышает 2047 символов (после обрезания начального и конечного пробелов), как @ t-clausen.dk правильно отметил в своем комментарии.Поэтому следует использовать пользовательскую таблицу , если возможны более длинные входные строки.