Диагностика ошибок размера строки
Компонент 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