Stawiliśmy czoła bardzo dziwnemu problemowi (naprawdę dziwnemu w przypadku tak dojrzałego produktu): jak uzyskać liczbę znaków w ciągu znaków Unicode za pomocą instrukcji Transact-SQL . Kluczowym problemem tego problemu jest to, że funkcja TSQL len()
zwraca liczbę znaków, wykluczając końcowe znaki. Innym wariantem jest użycie długości danych (która zwraca liczbę bajtów) i podzielenie przez 2, więc zdobądź liczbę znaków Unicode. Ale znaki Unicode mogą być parami zastępczymi, więc to też nie zadziała.Jak uzyskać liczbę znaków w łańcuchu w języku Transact SQL, "w inny sposób"
Mamy 2 warianty rozwiązania: pierwszy to użycie len(replace())
, a drugi to dodanie pojedynczego symbolu, a następnie odjęcie 1 od wyniku. Ale IMO oba warianty są raczej brzydkie.
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
Jakieś inne pomysły na zliczanie znaków w łańcuchu z końcowymi spacjami?
Wow, nie miałem pojęcia, że usunięte spacjami! Osobiście pójdę z addAndMinusBehaviour. –
Osobiście nie widzę nic brzydkiego w twoim "addAndMinusBehaviour" - w rzeczywistości myślę, że jest to dość sprytne. – AakashM
Znalazłem to jako opcję len (reverse (@txt)), które będzie działało dla spacji końcowych, ale oczywiście będzie się zrywało z wiodącymi spacjami. –