it-swarm.it

Comportamento di Varchar con spazi alla fine

Quando uso un Varchar con spazi, alla fine ignora gli spazi.

ex:

declare @X varchar(50)

Questo...

set  @X= 'John'

...equivale a...

set @X= 'John           '

Li considera uguali. Come posso fare in modo che il sistema li riconosca come diversi?

14
AMH

Tutto è conforme allo standard ANSI:

Spiegazione degli spazi vuoti finali :

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 anziché 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ù su spazi vuoti finali e la clausola LIKE .

[~ # ~] ma [~ # ~] se vuoi differenziarli, puoi decidere di usare la funzione DATALENGTH invece di LEN, perché

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

ti metterà 1 invece di

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

La soluzione è

  • utilizzare la funzione DATALENGTH per differenziare le stringhe
  • per eseguire il cast della stringa nel tipo NVARCHAR - potrebbe essere meglio dichiarare questo tipo al parametro di SP
23
Oleg Dok