Risposte:
Tutto è conforme allo standard ANSI:
SQL Server segue le specifiche ANSI / ISO SQL-92 (Sezione 8.2,, Regole generali n. 3) su come confrontare le stringhe con gli spazi. Lo standard ANSI richiede il riempimento per le stringhe di caratteri utilizzate nei confronti in modo che le loro lunghezze corrispondano prima di confrontarle. Il padding influenza direttamente la semantica dei predicati della clausola WHERE e HAVING e altri confronti di stringhe Transact-SQL. Ad esempio, Transact-SQL considera le stringhe 'abc' e 'abc' equivalenti per la maggior parte delle operazioni di confronto.
L'unica eccezione a questa regola è il predicato LIKE. Quando il lato destro di un'espressione di predicato LIKE presenta un valore con uno spazio finale, SQL Server non riempie i due valori della stessa lunghezza prima che si verifichi il confronto. Poiché lo scopo del predicato LIKE, per definizione, è facilitare le ricerche di schemi piuttosto che semplici test di uguaglianza di stringhe, ciò non viola la sezione della specifica ANSI SQL-92 menzionata in precedenza.
Ecco un esempio ben noto di tutti i casi sopra menzionati:
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
Ecco alcuni dettagli in più sul bianco finale e sulla LIKE
clausola .
MA se si desidera differenziarli, è possibile decidere di utilizzare la DATALENGTH
funzione anziché LEN
, perché
SELECT 1 WHERE LEN('John ') = LEN('John')
ti metterà 1 invece di
SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')
La soluzione è
Puoi semplicemente aggiungere uno spazio bianco alle tue condizioni.
set @X= 'John \n'
\n
non ha significato in SQL Server. Non viene interpretato come una nuova linea. Questa non è una risposta alla domanda posta comunque.