sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server 2008 Cadena vacía frente a espacio

varchar s y la igualdad son espinosas en TSQL. El LEN función dice:

Devuelve el número de caracteres, en lugar del número de bytes, de la expresión de cadena dada, excluyendo los espacios en blanco .

Necesitas usar DATALENGTH para obtener un verdadero byte recuento de los datos en cuestión. Si tiene datos Unicode, tenga en cuenta que el valor que obtenga en esta situación no será el mismo que la longitud del texto.

print(DATALENGTH(' ')) --1
print(LEN(' '))        --0

Cuando se trata de la igualdad de expresiones, las dos cadenas se comparan para la igualdad como esta:

  • Obtener cadena más corta
  • Bloc con espacios en blanco hasta que la longitud sea igual a la de una cadena más larga
  • Compara los dos

Es el paso intermedio el que está causando resultados inesperados:después de ese paso, está comparando efectivamente espacios en blanco contra espacios en blanco, por lo tanto, se ven como iguales.

LIKE se comporta mejor que = en la situación de "espacios en blanco" porque no realiza el relleno en blanco en el patrón que estaba tratando de hacer coincidir:

if '' = ' '
print 'eq'
else
print 'ne'

Dará eq mientras:

if '' LIKE ' '
print 'eq'
else
print 'ne'

Dará ne

Cuidado con LIKE aunque:no es simétrico:trata los espacios en blanco finales como significativos en el patrón (RHS) pero no en la expresión de coincidencia (LHS). Lo siguiente está tomado de aquí:

declare @Space nvarchar(10)
declare @Space2 nvarchar(10)

set @Space = ''
set @Space2 = ' '

if @Space like @Space2
print '@Space Like @Space2'
else
print '@Space Not Like @Space2'

if @Space2 like @Space
print '@Space2 Like @Space'
else
print '@Space2 Not Like @Space'

@Space Not Like @Space2
@Space2 Like @Space