it-swarm.com.de

Verhalten von Varchar mit Leerzeichen am Ende

Wenn ich einen Varchar mit Leerzeichen verwende, werden die Leerzeichen am Ende ignoriert.

ex:

declare @X varchar(50)

Diese...

set  @X= 'John'

...ist das gleiche wie...

set @X= 'John           '

Es betrachtet diese als gleich. Wie kann ich das System veranlassen, diese als unterschiedlich zu erkennen?

14
AMH

Alles entspricht nur dem ANSI-Standard:

Nachgestellte Leerzeichen erklärt :

SQL Server folgt der ANSI/ISO SQL-92-Spezifikation (Abschnitt 8.2, Allgemeine Regeln Nr. 3) zum Vergleichen von Zeichenfolgen mit Leerzeichen. Der ANSI-Standard erfordert ein Auffüllen der in Vergleichen verwendeten Zeichenfolgen, damit ihre Längen übereinstimmen, bevor sie verglichen werden. Das Auffüllen wirkt sich direkt auf die Semantik von WHERE- und HAVING-Klauselprädikaten und anderen Transact-SQL-Zeichenfolgenvergleichen aus. Beispielsweise betrachtet Transact-SQL die Zeichenfolgen 'abc' und 'abc' für die meisten Vergleichsoperationen als äquivalent.

Die einzige Ausnahme von dieser Regel ist das LIKE-Prädikat. Wenn die rechte Seite eines LIKE-Prädikatausdrucks einen Wert mit einem nachgestellten Leerzeichen enthält, füllt SQL Server die beiden Werte vor dem Vergleich nicht auf dieselbe Länge auf. Da der Zweck des LIKE-Prädikats per Definition darin besteht, die Mustersuche zu vereinfachen, anstatt einfache Zeichenfolgengleichheitstests durchzuführen, verstößt dies nicht gegen den zuvor erwähnten Abschnitt der ANSI SQL-92-Spezifikation.

Hier ist ein bekanntes Beispiel für alle oben genannten Fälle:

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

Hier einige Details zu nachgestellte Leerzeichen und die Klausel LIKE .

[~ # ~] aber [~ # ~] Wenn Sie sie unterscheiden möchten, können Sie die Funktion DATALENGTH anstelle von verwenden LEN, weil

SELECT 1 WHERE LEN('John ') = LEN('John')

wird dir 1 statt setzen

SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')

Die Lösung ist

  • verwenden der DATALENGTH-Funktion, um zwischen Zeichenfolgen zu unterscheiden
  • um den String in den NVARCHAR-Typ umzuwandeln, ist es möglicherweise besser, diesen Typ als Parameter von SP zu deklarieren
23
Oleg Dok