Обходим ошибку The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator


30.05.2012 || Раздел: || MS SQL Server


Инструкция по устранению ошибки при работе с SQL запросом - "The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator", если в запросе присутствует сортировка (ORDER BY) или группировка (GROUP BY):

Пример сообщения об ошибке:

Server: Msg 306, Level 16, State 1, Line 1
The text, ntext, and image data types cannot be compared
or sorted, except when using IS NULL or LIKE operator.

Тип данных NTEXT используется для данных в кодировке Unicode произвольной длины, тип данных TEXT используется для данных в остальных кодировках произвольной длины, тип данных IMAGE используется для бинарных данных произвольной длины.

Один из путей получить эту ошибку - это включить колонку типа TEXT, NTEXT или IMAGE в сортировку (ORDER BY). Для иллюстрации приведу скрипт, генерирующий эту ошибку:

CREATE TABLE [dbo].[Article] (
    [ArticleID]     INT NOT NULL IDENTITY(1, 1),
    [ArticleName]          NVARCHAR(200),
    [Author]            NVARCHAR(100),
    [Summary]           NTEXT
)

SELECT * FROM [dbo].[Article]
ORDER BY [Summary]

В итоге получим эту ошибку:

Msg 306, Level 16, State 2, Line 2
The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.

Другой путь получения этой ошибки - включить колонку типа TEXT, NTEXT или IMAGE в группировку (GROUP BY), например как в этом скрипте:

SELECT [Summary], COUNT(*)
FROM [dbo].[Article]
GROUP BY [Summary]

Т.к. в новых версиях SQL Server типы данных ntext, text и image будут удалены, то следует избегать их использования. При использовании SQL Server версии 2005 или новее используйте типы nvarchar(max), varchar(max) и varbinary(max) соответственно.

Пути обхода

Если изменить типы в таблице нет возможности, а использовать подобные запросы необходимо, то можно воспользоваться следующим решением - преобразовать колонки типа TEXT или NEXT в тип VARCHAR или NVARCHAR непосредственно в SELECT-запросах при использовании сортировки (ORDER BY) и/или группировки (GROUP BY).

Примеры:

1) При использовании SQL Server 2000 колонка типа NTEXT может быть сконвертирована в тип NVARCHAR(4000) в условии сортировки (ORDER BY) для избежания ошибки и генерации желаемого результата:

SELECT * FROM [dbo].[Article]
ORDER BY CAST([Summary] AS NVARCHAR(4000))

При использовании SQL Server 2005 или SQL Server 2008 (или новее), вместо NVARCHAR(4000), колонка типа NTEXT может быть сконвертирована в тип NVARCHAR(MAX):

SELECT * FROM [dbo].[Article]
ORDER BY CAST([Summary] AS NVARCHAR(MAX))

2) Если необходимо сделать группировку подобных поле, поступаем также, как в примере 1.

Для SQL Server 2000:

SELECT CAST([Summary] AS NVARCHAR(4000)) AS [Summary], COUNT(*)
FROM [dbo].[Article]
GROUP BY CAST([Summary] AS NVARCHAR(4000))

Для SQL Server 2005 или SQL Server 2008 (или новее):

SELECT CAST([Summary] AS NVARCHAR(MAX)) AS [Summary], COUNT(*)
FROM [dbo].[Article]
GROUP BY CAST([Summary] AS NVARCHAR(MAX))

Во избежании подобной ошибки рекомендуется преобразовать все имеющиеся таблицы с подобными типами данных в типы VARCHAR(MAX), NVARCHAR(MAX) и VARBINARY(MAX) соответственно.

© Элла С. (Автор: Ella Sea)

< Предыдущая статья

Видеоурок: создание динамических страниц на основе представлений

Следующая статья >

Установка роли Web Server (включение IIS) на Windows Web Server 2008 R2 для работы сайтов на ASP.Net

Похожие статьи