Подтвердить что ты не робот

Есть ли способ DISTINCT или group с помощью текста (или ntext) в SQL Server 2005?

В таблице у меня есть столбец MEMO_TEXT, который является текстовым типом данных. Когда я пытаюсь создать представление и использовать GROUP BY, я получаю следующую ошибку:

Ошибка базы данных SQL Server: типы данных text, ntext и изображения не могут сравниваться или сортироваться, за исключением случаев использования оператора IS NULL или LIKE.

Я получаю эту ошибку, когда я пытаюсь сделать DISTINCT в запросе. Любые идеи о том, как обойти это?

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

4b9b3361

Ответ 1

Один взломать его - это сделать его как nvarchar(max).

Это documented способ увеличить длину строки за 4000:

nvarchar [ ( n | max ) ]

Строковые данные Unicode с переменной длиной. n определяет длину строки и может быть значением от 1 до 4000. max указывает, что максимальный размер хранилища составляет 2 ^ 31-1 байта (2 ГБ). Размер памяти в байтах в два раза превышает фактическую длину введенных данных + 2 байта. Синонимы ISO для nvarchar являются национальными char различными и национальными символами.

Аналогичный трюк применяется к varchar().

Ответ 2

Попробуйте эти...

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))

Ответ 3

Знаете ли вы, что в поле ntext никогда не будет повторяющихся данных? Вы можете сделать выделение в производной таблице на других полях, а затем присоединиться к таблице с полем ntext и захватить ее во внешнем запросе.

что-то вроде (предположим, что поле3 является полем 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

Ответ 4

Можете ли вы просто изменить тип данных столбца на nvarchar (max)?

Подумайте о том, чтобы положить в другой столбец, который принимает первые 40 символов или около того вашего поля memo и группировать его. Группировка в поле memo будет очень медленной, если у вас там много текста.

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