2010-08-22 11 views
42

Se uso qualcosa comeQual è il modo giusto per confrontare una colonna NTEXT con un valore costante?

[ntext2] <> '1,032.5', 

ottengo questo errore:

The data types ntext and varchar are incompatible in the not equal to operator.

La soluzione migliore sarebbe se il confronto viene implementata nello stesso modo per qualsiasi tipo di colonna. L'operatore (<> è applicabile sia a NVARCHAR che a INT).

+0

convertirlo in NVARCHAR (MAX) e le relative funzioni stringa sarà a vostra disposizione ... NTEXT è disordinato, è deprecato - sbarazzarsi di esso ! –

+2

Se qualcuno chiede a M $ di convertire i NTEXT dei loro CRM DB in NVARCHAR, firmerò la petizione;) – noober

risposta

48

Il tipo di dati ntext è obsoleto a favore del tipo di dati nvarchar(max). Se è possibile modificare il tipo di dati nella tabella, quella sarebbe la soluzione migliore. Quindi non c'è alcun problema nel confronto con un valore letterale varchar.

In caso contrario si dovrà lanciare il valore prima confrontandolo:

cast([ntext2] as nvarchar(max)) <> '1,032.5' 

Si potrebbe anche considerare l'utilizzo di un nvarchar letterale, che risolve alcuni simili tipi di dati problemi:

cast([ntext2] as nvarchar(max)) <> N'1,032.5' 
+1

Sfortunatamente, non è un'opzione, poiché MS usa ntext da solo, sebbene dichiari deprecato nello stesso tempo. Proverò sia il prefisso N che il casting, grazie per la risposta. – noober

8

Se si farebbe preferire non eseguire il cast, è possibile ottenere in alcuni scenari utilizzando LIKE o PATINDEX, come dimostrato su questo thread MSDN: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/6bd4c661-ea0b-435f-af78-097e61549d41

L'espressione LIKE, senza caratteri jolly, sarebbe (in questo caso) approssimativamente equivalente a un test di uguaglianza.

In questo caso, l'espressione sarebbe:

[ntext2] NOT LIKE '1,032.5' 
+0

LIKE richiede che il DB sia indicizzato correttamente (AFAIK). Mi piacerebbe evitare questo reqirement. – noober

+0

@noober: le clausole LIKE non traggono molto vantaggio dagli indici, tranne nel caso in cui non contengano caratteri jolly iniziali. Un cast probabilmente trascurerà un indice esistente. Se sei preoccupato per le prestazioni, sarebbe nel tuo interesse per il test delle prestazioni ciascuna delle opzioni (cast, like, patindex) con e senza un indice. Se ho un momento oggi, lo controllerò. – kbrimington

+0

No, ho appena testato LIKE con NTEXT su DB diversi e non è riuscito con uno di essi. Non potevo essere giustiziato. Il problema era qualcosa con gli indici. Quindi non posso essere sicuro che LIKE funzionerà ovunque. – noober

Problemi correlati