Share via


Solucionar errores de tamaños de filas

A veces, SQL Server Database Engine (Motor de base de datos de SQL Server) realiza las operaciones de ordenación antes de evaluar las expresiones. Por tanto, algunas consultas que se ejecutan en SQL Server 2000 pueden devolver un error en SQL Server 2008. Estas consultas normalmente especifican lo siguiente:

  • Campos char, nchar, varchar y nvarchar muy largos en sus conjuntos de resultados.

  • Cualquier cláusula que pueda hacer que Motor de base de datos inicie una operación de ordenación, por ejemplo, las cláusulas ORDER BY, GROUP BY y DISTINCT; y también las cláusulas JOIN que el optimizador de consultas de SQL Server elige para resolver utilizando un algoritmo Merge Join que requiere la ordenación.

Es posible que Motor de base de datos realice la operación de ordenación antes de evaluar las expresiones que aparecen anteriormente en la consulta. Para ello, Motor de base de datos debe crear una tabla de trabajo para almacenar resultados intermedios. Si esta tabla de trabajo requiere una creación de filas que exceda el límite de 8.060 bytes, la consulta devolverá un error.

Por ejemplo, supongamos que disponemos del siguiente conjunto de tablas:

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

Ahora suponga la siguiente consulta. Esta consulta se ejecuta en SQL Server 2000 pero devuelve un error en SQL Server 2008:

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

La consulta produce un error en SQL Server 2008 porque Motor de base de datos evalúa la cláusula ORDER BY antes de evaluar la cláusula en SQL Server 2000 y porque la consulta solicita un campo char muy largo en su conjunto de resultados. La tabla de trabajo que genera Motor de base de datos especifica una o varias filas que exceden el límite de 8.060 bytes.

Para ejecutar la consulta correctamente, convierta los campos largos de la lista seleccionada en los tipos de datos varchar(max) o nvarchar(max) utilizando CAST o CONVERT. Por ejemplo, la siguiente consulta se ejecuta correctamente en SQL Server 2005:

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

Vea también

Referencia

Otros recursos