Есть ли способ отличить или сгруппировать по тексту (или ntext) в SQL Server 2005? - PullRequest
27 голосов
/ 22 июня 2009

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

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

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

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

Ответы [ 4 ]

38 голосов
/ 22 июня 2009

Один хак вокруг - разыграть его как nvarchar(max).

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

nvarchar [ ( n | max ) ]

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

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

22 голосов
/ 22 июня 2009

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

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))
1 голос
/ 22 июня 2009

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

что-то вроде (предположим, field3 это поле 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
0 голосов
/ 22 июня 2009

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

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

UPDATE myTable SET myNewField = LEFT(myOldField, 40);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...