Відповіді:
Все просто за стандартом 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. Це не трактується як новий рядок. Це все ж не відповідь на запитання.