Есть ли способ DISTINCT или group с помощью текста (или ntext) в SQL Server 2005?
В таблице у меня есть столбец MEMO_TEXT, который является текстовым типом данных. Когда я пытаюсь создать представление и использовать GROUP BY, я получаю следующую ошибку:
Ошибка базы данных SQL Server: типы данных text, ntext и изображения не могут сравниваться или сортироваться, за исключением случаев использования оператора IS NULL или LIKE.
Я получаю эту ошибку, когда я пытаюсь сделать DISTINCT в запросе. Любые идеи о том, как обойти это?
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.
Ответы
Ответ 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);