Respostas:
Tudo está de acordo com o padrão ANSI:
Espaços em branco à direita explicados :
O SQL Server segue a especificação ANSI / ISO SQL-92 (Seção 8.2, Regras gerais nº 3) sobre como comparar seqüências de caracteres com espaços. O padrão ANSI requer preenchimento para as seqüências de caracteres usadas nas comparações para que seus comprimentos correspondam antes de compará-las. O preenchimento afeta diretamente a semântica dos predicados das cláusulas WHERE e HAVING e outras comparações de cadeias Transact-SQL. Por exemplo, o Transact-SQL considera as seqüências de caracteres 'abc' e 'abc' como equivalentes para a maioria das operações de comparação.
A única exceção a esta regra é o predicado LIKE. Quando o lado direito de uma expressão de predicado LIKE apresenta um valor com um espaço à direita, o SQL Server não preenche os dois valores no mesmo comprimento antes que a comparação ocorra. Como o objetivo do predicado LIKE, por definição, é facilitar as pesquisas de padrões em vez de simples testes de igualdade de cadeias, isso não viola a seção da especificação ANSI SQL-92 mencionada anteriormente.
Aqui está um exemplo bem conhecido de todos os casos mencionados acima:
DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)
SET @a = '1'
SET @b = '1 ' --with trailing blank
SELECT 1
WHERE
@a = @b
AND @a NOT LIKE @b
AND @b LIKE @a
Aqui estão mais alguns detalhes sobre espaços em branco à direita e a LIKE
cláusula .
MAS, se você quiser diferenciá-los - você pode optar por usar a DATALENGTH
função em vez de LEN
, porque
SELECT 1 WHERE LEN('John ') = LEN('John')
vai te colocar 1 em vez de
SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')
A solução é
Você pode simplesmente adicionar um espaço em branco à sua condição.
set @X= 'John \n'
\n
não tem significado no SQL Server. Não é interpretado como uma nova linha. Esta não é uma resposta para a pergunta de qualquer maneira.