2009-06-22 22 views
26

En una tabla, tengo una columna llamada MEMO_TEXT que es un tipo de datos de texto. Cuando intento crear una vista y utilizar un GROUP BY, me sale el siguiente error:¿Hay alguna manera de DISTINCT o agrupar por un texto (o ntext) en SQL Server 2005?

SQL Server Database Error: The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

consigo este error cuando intento hacer un DISTINCT en la consulta también. ¿Alguna idea sobre cómo solucionar esto?

Si necesita más información, hágamelo saber.

Respuesta

36

Un truco a su alrededor es echarlo como nvarchar(max).

Ésta es una manera documented para aumentar la longitud de la cadena más allá de 4000:

nvarchar [ (n | max) ]

Variable-length Unicode string data. n defines the string length and can be a value from 1 through 4,000. max indicates that the maximum storage size is 2^31-1 bytes (2 GB). The storage size, in bytes, is two times the actual length of data entered + 2 bytes. The ISO synonyms for nvarchar are national char varying and national character varying.

Un truco similar se aplica a varchar().

+4

+1 no llamaría a esto un truco en absoluto, nvarchar (max) sustituye a ntext. –

+3

Sería menos complicado cambiar la estructura subyacente para que sea un nvarchar (máximo) aunque ... –

22

Pruebe estos ...

SELECT DistinctMemo = DISTINCT(CAST(MEMO_TEXT AS varchar(max))) 
FROM MyTable 

-- or 

SELECT DistinctMemo = CAST(MEMO_TEXT AS varchar(max)) 
FROM MyTable 
GROUP BY CAST(MEMO_TEXT AS varchar(max)) 
0

puede usted apenas cambiar el tipo de datos de la columna de nvarchar (max)?

Considere poner en otra columna que ocupe los primeros 40 caracteres más o menos de su campo memo, y agrupe eso. Agrupar en un campo memo va a ser realmente lento si tiene mucho texto allí.

UPDATE myTable SET myNewField = LEFT(myOldField, 40); 
1

¿Sabía que nunca habrá datos repetidos en el campo ntext? Puede hacer lo distinto en una tabla derivada en los otros campos y luego unirse a la tabla con el campo ntext y tomarlo en la consulta externa.

algo así (se supone field3 es el campo ntext)

select mt.idfield, a.field1, a.field2, mt.field3 
from mytable mt 
join 
(select disitinct mt1.idfield, mt1.field1, mot.field2 from mytable mt1 
join myothertable mot on mt1.idfield = mot.idfield) a 
    on a.ifield = mt.idfield 
Cuestiones relacionadas