Поделиться через


Диагностика ошибок размера строки

Компонент SQL Server Database Engine перед вычислением выражений иногда выполняет операции сортировки. Поэтому некоторые запросы, которые успешно выполняются в SQL Server 2000, могут завершиться ошибкой в SQL Server 2008. В этих запросах, как правило, содержится следующее:

  • Слишком длинные поля типа char, nchar, varchar и nvarchar в результирующих наборах.

  • Любые предложения, которые могут привести к выполнению компонентом Database Engine операций сортировки, например ORDER BY, GROUP BY и DISTINCT. Предложения JOIN, которые оптимизатор запросов SQL Server разрешает с помощью алгоритма Merge Join, требующего выполнения сортировки.

Компонент Database Engine может выполнять операции сортировки до оценки каких-либо выражений, объявленных ранее в запросе. Для этого компонент Database Engine должен создать рабочую таблицу для хранения промежуточных результатов. Если в рабочей таблице потребуется создание строк, превышающих ограничение на длину в 8 060 байт, запрос завершится ошибкой.

Например, рассмотрим следующий набор таблиц:

USE tempdb;
GO
CREATE TABLE t1
    (ch char(6000), vch1 varchar(100), vch2 varchar(100), vch3 varchar(100));
CREATE TABLE t2(i int);
GO
INSERT t1 VALUES(REPLICATE('abc', 2000), 
    '123456789012345678901234567890', '123456789012345678901234567890',
    '123456789012345678901234567890');
INSERT t2 VALUES(7);
INSERT t2 VALUES(13);
GO

Теперь рассмотрим следующий запрос. Этот запрос успешно выполнится в SQL Server 2000, но в SQL Server 2008 завершится ошибкой:

SELECT ch+ch, vch1, vch2, vch3 
FROM t1, t2 
ORDER BY vch1, i;
GO

Этот запрос завершается ошибкой в SQL Server 2008, потому что компонентом Database Engine предложение ORDER BY вычисляется раньше, чем оно вычисляется SQL Server 2000, по этой причине запрос пытается получить слишком длинное поле char в результирующем наборе. В рабочей таблице, созданной компонентом Database Engine, создается одна или несколько строк, превышающих ограничение в 8 060 байт.

Чтобы запрос выполнился успешно, преобразуйте длинные поля в списке выборки в тип данных varchar(max) или nvarchar(max) с помощью оператора CAST или CONVERT. Например, следующий запрос выполняется без ошибки в SQL Server 2005:

SELECT CONVERT(varchar(max),ch+ch), vch1, vch2, vch3 
FROM t1, t2 
ORDER BY vch1, i;
GO

См. также

Справочник

Другие ресурсы