Tsql теория > Обходим ошибку The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator
25.09.2013 14:12:40
Наиболее часто встречающиеся слова в статье:
[Summary] [NVARCHAR] [Article] [compared] [operator] [используется] [произвольной] [использовании SQL] [соответственно] [необходимо]
Статья:
Инструкция по устранению ошибки при работе с 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) соответственно.