Odpowiedzi:
Wszystko jest zgodne ze standardem ANSI:
Wyjaśnienie spacji końcowych :
Program SQL Server jest zgodny ze specyfikacją ANSI / ISO SQL-92 (Rozdział 8.2, Ogólne zasady nr 3) w zakresie porównywania ciągów ze spacjami. Norma ANSI wymaga uzupełnienia ciągów znaków używanych w porównaniach, aby ich długości pasowały przed porównaniem. Wypełnienie wpływa bezpośrednio na semantykę predykatów klauzul WHERE i HAVING oraz innych porównań ciągów Transact-SQL. Na przykład Transact-SQL uważa, że ciągi „abc” i „abc” są równoważne dla większości operacji porównania.
Jedynym wyjątkiem od tej reguły jest predykat LIKE. Gdy prawa strona wyrażenia predykcyjnego LIKE zawiera wartość ze spacją końcową, SQL Server nie uzupełnia dwóch wartości do tej samej długości przed wystąpieniem porównania. Ponieważ predykat LIKE z definicji ma ułatwić wyszukiwanie wzorców, a nie proste testy równości ciągów, nie narusza to wspomnianej wcześniej sekcji specyfikacji ANSI SQL-92.
Oto dobrze znany przykład wszystkich wyżej wymienionych przypadków:
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
Oto więcej szczegółów na temat spacji końcowych i LIKE
klauzuli .
ALE jeśli chcesz je odróżnić - możesz DATALENGTH
zamiast tego użyć funkcji LEN
, ponieważ
SELECT 1 WHERE LEN('John ') = LEN('John')
da ci 1 zamiast
SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')
Rozwiązaniem jest
Możesz po prostu dodać białą spację do swojego stanu.
set @X= 'John \n'
\n
nie ma znaczenia w SQL Server. Nie jest interpretowany jako nowa linia. To i tak nie jest odpowiedź na zadane pytanie.