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): Пример сообщения об ошибке:
Тип данных NTEXT используется для данных в кодировке Unicode произвольной длины, тип данных TEXT используется для данных в остальных кодировках произвольной длины, тип данных IMAGE используется для бинарных данных произвольной длины. Один из путей получить эту ошибку - это включить колонку типа TEXT, NTEXT или IMAGE в сортировку (ORDER BY). Для иллюстрации приведу скрипт, генерирующий эту ошибку:
В итоге получим эту ошибку: Msg 306, Level 16, State 2, Line 2 Другой путь получения этой ошибки - включить колонку типа 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) соответственно.
Похожие статьи
|
|