Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

String vazia do SQL Server 2008 vs. espaço


varchar se igualdade são espinhosos em TSQL. O LEN função diz:

Retorna o número de caracteres, em vez do número de bytes, da expressão de string fornecida, excluindo espaços em branco à direita .

Você precisa usar DATALENGTH para obter um byte verdadeiro contagem dos dados em questão. Se você tiver dados unicode, observe que o valor obtido nessa situação não será o mesmo que o comprimento do texto.
print(DATALENGTH(' ')) --1
print(LEN(' '))        --0

Quando se trata de igualdade de expressões, as duas strings são comparadas para igualdade assim:
  • Obtenha uma string mais curta
  • Almofada com espaços em branco até que o comprimento seja igual ao da string mais longa
  • Compare os dois

É a etapa do meio que está causando resultados inesperados - após essa etapa, você está comparando efetivamente o espaço em branco com o espaço em branco - portanto, eles são vistos como iguais.

LIKE se comporta melhor que = na situação de "brancos" porque não executa preenchimento em branco no padrão que você estava tentando corresponder:
if '' = ' '
print 'eq'
else
print 'ne'

Dará eq enquanto:
if '' LIKE ' '
print 'eq'
else
print 'ne'

Dará ne

Cuidado com LIKE embora:não é simétrico:trata o espaço em branco à direita como significativo no padrão (RHS), mas não na expressão de correspondência (LHS). O seguinte é retirado daqui:
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