Este código proporciona un patrón que puede extender para manejar el espacio en blanco de su elección para un LTRIM
modificado .
declare @Tab as NVarChar(1) = NChar( 9 );
declare @Space as NVarChar(1) = NChar( 32 );
declare @Samples as Table ( String NVarChar(16) );
insert into @Samples ( String ) values
( 'Foo' ),
( @Tab + 'Foo' ),
( @Space + 'Foo' ),
( @Space + @Tab + 'Foo' ),
( @Tab + @Space + 'Foo' );
select String, Len( String ) as [Length], PatIndex( '%[^' + @Tab + @Space + ']%', String ) - 1 as [WhitespaceCount]
from @Samples;
El REVERSE
La función se puede utilizar para implementar una versión modificada de RTRIM
.
ACTUALIZACIÓN MÁS NUEVA :El siguiente código usa la lista de caracteres de espacio en blanco como se usa en .NET Framework 4. También funciona alrededor de la característica de LEN
sin contar los espacios en blanco finales.
declare @Tab as NVarChar(1) = NChar( 9 );
declare @Space as NVarChar(1) = NChar( 32 );
declare @Samples as Table ( String NVarChar(16) );
insert into @Samples ( String ) values
( 'Foo' ),
( @Tab + 'Foo' ),
( @Space + 'Foo' ),
( @Space + @Tab + 'Foo' ),
( @Tab + @Space + 'Foo' ),
( @Tab + 'Foo' + @Space ),
( @Space + 'Foo' + @Tab ),
( @Space + @Tab + 'Foo' + @Tab + @Space ),
( @Tab + @Space + 'Foo' + @Space + @Tab ),
( 'Foo' + @Tab ),
( NULL ),
( ' ' ),
( @Space + NULL + @Tab + @Tab ),
( '' ),
( 'Hello world!' );
declare @WhitespacePattern as NVarChar(100) = N'%[^' +
NChar( 0x0020 ) + NChar( 0x00A0 ) + NChar( 0x1680 ) + NChar( 0x2000 ) +
NChar( 0x2001 ) + NChar( 0x2002 ) + NChar( 0x2003 ) + NChar( 0x2004 ) +
NChar( 0x2005 ) + NChar( 0x2006 ) + NChar( 0x2007 ) + NChar( 0x2008 ) +
NChar( 0x2009 ) + NChar( 0x200A ) + NChar( 0x202F ) + NChar( 0x205F ) +
NChar( 0x3000 ) + NChar( 0x2028 ) + NChar( 0x2029 ) + NChar( 0x0009 ) +
NChar( 0x000A ) + NChar( 0x000B ) + NChar( 0x000C ) + NChar( 0x000D ) +
NChar( 0x0085 ) + N']%';
-- NB: The Len function does not count trailing spaces.
-- Use DataLength instead.
with AnalyzedSamples as (
select String, DataLength( String ) / DataLength( NChar( 42 ) ) as [StringLength],
PatIndex( @WhitespacePattern, String ) - 1 as [LeftWhitespace],
PatIndex( @WhitespacePattern, Reverse( String ) ) - 1 as [RightWhitespace]
from @Samples ),
TrimmedSamples as (
select String, StringLength, [LeftWhitespace], [RightWhitespace],
case
when String is NULL then NULL
when LeftWhitespace = -1 then N''
else Substring( String, LeftWhitespace + 1, StringLength - LeftWhitespace )
end as [LTrim],
case
when String is NULL then NULL
when RightWhitespace = -1 then N''
else Reverse( Substring( Reverse( String ), RightWhitespace + 1, StringLength - RightWhitespace ) )
end as [RTrim],
case
when String is NULL then NULL
when LeftWhitespace = -1 then N''
else Substring( String, LeftWhitespace + 1, StringLength - LeftWhitespace - RightWhitespace )
end as [Trim]
from AnalyzedSamples )
select N'"' + String + N'"' as [String], StringLength, [LeftWhitespace], [RightWhitespace],
N'"' + [LTrim] + N'"' as [LTrim], DataLength( [LTRIM] ) / DataLength( NChar( 42 ) ) as [LTrimLength],
N'"' + [RTrim] + N'"' as [RTrim], DataLength( [RTRIM] ) / DataLength( NChar( 42 ) ) as [RTrimLength],
N'"' + [Trim] + N'"' as [Trim], DataLength( [TRIM] ) / DataLength( NChar( 42 ) ) as [TrimLength]
from TrimmedSamples;