Как получить количество символов в строке в Transact SQL «другим способом» - PullRequest
9 голосов
/ 22 июня 2009

Мы столкнулись с очень странной проблемой (действительно странной для такого зрелого продукта): Как получить количество символов в строке Unicode с помощью операторов Transact-SQL. Основная проблема этой проблемы в том, что функция len() TSQL возвращает количество символов, исключая конечные пробелы. Другой вариант - использовать длину данных (которая возвращает количество байтов) и разделить на 2, чтобы получить числа символов Unicode. Но символы Юникода могут быть суррогатными парами, поэтому они тоже не будут работать.

У нас есть 2 варианта решения: первый - использовать len(replace()), а второй - добавить один символ, а затем вычесть 1 из результата. Но ИМО оба варианта довольно некрасивые.

declare @txt nvarchar(10)
set @txt = 'stack ' 
select @txt as variable, 
 len(@txt) as lenBehaviour, 
 DATALENGTH(@txt)/2 as datalengthBehaviour, 
 len(replace(@txt,' ','O')) as ReplaceBehaviour, 
 len(@txt+'.')-1 as addAndMinusBehaviour

Есть еще идеи, как считать символы в строке с пробелами?

Ответы [ 3 ]

5 голосов
/ 22 июня 2009

Я не могу оставить комментарий, поэтому мне придется оставить ответ (или закрыть).

Мой голос будет за addAndMinusBehaviour

У меня нет хорошей третьей альтернативы, возможно, есть какие-то непонятные правила пробелов, с которыми можно поиграться в назначении options / SET / Collation, но я не знаю больше подробностей в голове.

но на самом деле addAndMinusBehaviour, вероятно, самый простой в реализации, быстрый в исполнении и, если вы его документируете, также легко поддерживаемый.

4 голосов
/ 04 октября 2011
CREATE FUNCTION [dbo].[ufn_CountChar] ( @pInput VARCHAR(1000), @pSearchChar CHAR(1) )
RETURNS INT
BEGIN

RETURN (LEN(@pInput) - LEN(REPLACE(@pInput, @pSearchChar, '')))

END
GO
3 голосов
/ 22 июня 2009

Насколько я понимаю, DATALENGTH (@txt) / 2 всегда должен давать вам количество символов. SQL Server хранит символы Юникода в UCS-2, который не поддерживает суррогатные пары.

http://msdn.microsoft.com/en-us/library/ms186939.aspx

http://en.wikipedia.org/wiki/UCS2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...