Ответы:
Все в соответствии со стандартом ANSI:
Завершающие пробелы объяснили :
SQL Server следует спецификации ANSI / ISO SQL-92 (Раздел 8.2, Общие правила № 3), как сравнивать строки с пробелами. Стандарт ANSI требует заполнения для строк символов, используемых в сравнениях, чтобы их длина соответствовала перед сравнением. Заполнение напрямую влияет на семантику предикатов предложения WHERE и HAVING и другие сравнения строк Transact-SQL. Например, Transact-SQL считает, что строки 'abc' и 'abc' эквивалентны для большинства операций сравнения.
Единственным исключением из этого правила является предикат LIKE. Когда правая часть выражения предиката LIKE содержит значение с завершающим пробелом, SQL Server не дополняет два значения одинаковой длиной до того, как произойдет сравнение. Поскольку цель предиката LIKE по определению состоит в том, чтобы облегчить поиск по шаблону, а не в простых тестах на равенство строк, это не нарушает упомянутый ранее раздел спецификации ANSI SQL-92.
Вот хорошо известный пример всех случаев, упомянутых выше:
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
Вот еще несколько подробностей о конечных пробелах и LIKE
предложении .
НО, если вы хотите отличить их - вы можете решить использовать DATALENGTH
функцию вместо LEN
, потому что
SELECT 1 WHERE LEN('John ') = LEN('John')
поставит вас 1 вместо
SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')
Решение является
Вы можете просто добавить пробел к вашему состоянию.
set @X= 'John \n'
\n
не имеет значения в SQL Server. Это не интерпретируется как новая строка. Это не ответ на вопрос, заданный в любом случае.