2010-08-22 21 views
42

si uso algo así como¿Cuál es la forma correcta de comparar una columna NTEXT con un valor constante?

[ntext2] <> '1,032.5', 

consigo este error:

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

La mejor solución posible sería si la comparación se lleva a cabo de la misma manera para cualquier tipo de columna. (El operador <> es aplicable tanto para NVARCHAR como para INT).

+0

convertirlo en NVARCHAR (MAX) y todas las funciones de cadena estará disponible para usted ... NTEXT es desordenado, que está obsoleto - deshacerse de él ! –

+2

Si alguien le pide a M $ que convierta sus NTEXTs de CRM DB a NVARCHARs, firmaré la petición;) – noober

Respuesta

48

El tipo de datos ntext está en desuso en favor del tipo de datos nvarchar(max). Si puede cambiar el tipo de datos en la tabla, esa sería la mejor solución. Entonces no hay problema para compararlo con un literal varchar.

De lo contrario, tendría que emitir el valor antes de compararlo:

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

También puede considerar el uso de un nvarchar literal, que soluciona algunos problemas de tipos de datos similares:

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

Desafortunadamente, no es una opción, ya que MS usa ntext por sí mismo, aunque declara que está obsoleto al mismo tiempo. Probaré el prefijo N y el casting, gracias por la respuesta. – noober

8

Si lo haría Prefiere no emitir, puede hacerlo en algunos escenarios usando LIKE o PATINDEX, como se demuestra en esta cadena de mensajes de MSDN: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/6bd4c661-ea0b-435f-af78-097e61549d41

La expresión LIKE, sin comodines, sería (en este caso) más o menos equivalente a una prueba de igualdad.

En este caso, la expresión sería:

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

LIKE requiere que el DB esté correctamente indexado (AFAIK). Me gustaría evitar este requisito. – noober

+0

@noober: las cláusulas LIKE no se benefician demasiado de los índices, excepto en el caso en que no contengan comodines principales. Un elenco probablemente ignorará un índice existente. Si le preocupa el rendimiento, le conviene realizar una prueba de rendimiento de cada una de las opciones (cast, like, patindex) con y sin índice. Si tengo un momento hoy, lo verificaré. – kbrimington

+0

No, acabo de probar LIKE con NTEXT en diferentes DB, y falló con uno de ellos. Simplemente no pudo ser ejecutado. El problema era algo con índices. Entonces no puedo estar seguro de que LIKE funcione en todas partes. – noober

Cuestiones relacionadas