Zachowanie Varchara ze spacjami na końcu

14

Kiedy używam Varchara ze spacjami, ignoruje spacje na końcu.

dawny:

declare @X varchar(50)

To...

set  @X= 'John'

...jest taki sam jak...

set @X= 'John           '

Uważa, że ​​są one równe. Jak sprawić, aby system rozpoznał je jako różne?

AMH
źródło

Odpowiedzi:

23

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 LIKEklauzuli .

ALE jeśli chcesz je odróżnić - możesz DATALENGTHzamiast 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

  • użyć funkcji DATALENGTH w celu odróżnienia ciągów
  • aby rzucić ciąg na typ NVARCHAR - może być lepiej zadeklarować ten typ na parametr SP
Oleg Dok
źródło
Spektakularny post, w końcu znalazłem dobre informacje
Gaspa79,
-2

Możesz po prostu dodać białą spację do swojego stanu.

set @X= 'John           \n'

Końcowe spacje w funkcjach łańcuchowych

Yiping
źródło
5
\nnie ma znaczenia w SQL Server. Nie jest interpretowany jako nowa linia. To i tak nie jest odpowiedź na zadane pytanie.
Martin Smith
@MartinSmith, ale jest napisane w MSDN „Jeśli musisz mieć końcowe spacje w swoim ciągu, powinieneś rozważyć dodanie znaku spacji na końcu, aby SQL Server nie przycinał łańcucha”.
Yiping