SQL – Impossibile selezionare come DISTINCT il tipo di dati ntext perché non è confrontabile – Come risolvere Come affrontare un fastidioso messaggio di errore SQL che colpisce Microsoft SQL Server e gli altri DBMS basati su T-SQL

SQL - The ntext data type cannot be selected as DISTINCT because it is not comparable - How to Fix

Se state leggendo questo articolo è probabile che siate alle prese con il comportamento anomalo di una query SQL / T-SQL che contiene una delle seguenti istruzioni:

  • un DISTINCT su una colonna con tipo di dati ntext.
  • un JOIN con più query e più tabelle;
  • una UNION con due o più tabelle;

La quale, durante l’esecuzione, produce il seguente messaggio di errore:

Il tipo di dati ntext non può essere selezionato come DISTINCT perché non è confrontabile.

oppure, se avete il sistema operativo lingua inglese:

The ntext data type cannot be selected as DISTINCT because it is not comparable.

Il problema è causato dal fatto che i data type (tipi di dato) ntext, text e image di SQL Server sono stati dichiarati obsoleti, come indicato in questo articolo ufficiale MSDN di cui menzioniamo di seguito la parte più rilevante:

I tipi di dati ntext, text e image verranno rimossi in una versione futura di SQL Server. Evitare di utilizzare questi tipi di dati in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni che attualmente li utilizzano. Usare in alternativa nvarchar(max), varchar(max)e varbinary(max) .

O, se preferite leggere lo stesso testo in lingua inglese:

ntext, text, and image data types will be removed in a future version of Microsoft SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.

Fortunatamente, possiamo risolvere il problema in almeno due modi.

Workaround

Dopo aver identificato la colonna o le colonne che utilizzano i data type obsoleti, è possibile utilizzare l’espressione CAST per convertirli nel data type accettato. Ad esempio, la seguente istruzione:

andrà riscritta nel seguente modo:

Soluzione

Il modo migliore per risolvere il problema è tuttavia un altro: al fine di non essere costretti ad effettuare un CAST in ogni situazione, scomodo per l’implementazione nonché pesante a livello di performance, è senz’altro meglio identificare le colonne che utilizzano i tipi di dati obsoleti e modificare permanentemente il loro data type utilizzando quello accettato. In dettaglio, quindi:

  • le colonne con data type ntext dovrebbero essere modificate in nvarchar(max)
  • le colonne con data type text dovrebbero essere modificate in varchar(max)
  • le colonne con data type image dovrebbero essere modificare in varbinary(max)

Spero che questa guida possa essere d’aiuto a quanti si trovano a dover affrontare il problema.

Alla prossima!

 

RELATED POSTS

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane.

View all posts by Ryan