Share via


Solucionando problemas de erros de tamanho de linha

O Mecanismo de banco de dados do SQL Server às vezes executa operações de classificação antes de avaliar expressões. Assim, algumas consultas executadas no SQL Server 2000 podem retornar um erro no SQL Server 2008. Essas consultas geralmente especificam o seguinte:

  • Campos char, nchar, varchar e nvarchar muito longos em seus conjuntos de resultados.

  • Alguma cláusula que possa fazer o Mecanismo de Banco de Dados iniciar uma operação de classificação, como as cláusulas ORDER BY, GROUP BY e DISTINCT; e também as cláusulas JOIN escolhidas pelo otimizador de consulta do SQL Server para resolução usando um algoritmo Merge Join que requeira classificação.

O Mecanismo de Banco de Dados pode executar a operação de classificação antes de avaliar qualquer expressão que tenha aparecido anteriormente na consulta. Para fazer isso, o Mecanismo de Banco de Dados deve criar uma mesa de trabalho para armazenar os resultados intermediários. Se essa tabela de trabalho exigir a criação de alguma linha que exceda o limite de 8.060 bytes, a consulta retornará um erro.

Por exemplo, considere o seguinte conjunto de tabelas:

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

Agora, considere a consulta seguir. Essa consulta é executada no SQL Server 2000, mas retorna um erro no SQL Server 2008:

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

A consulta apresenta falha no SQL Server 2008 porque o Mecanismo de Banco de Dados avalia a cláusula ORDER BY antes de avaliar a cláusula no SQL Server 2000, e porque a consulta requer um campo char muito longo em seu conjunto de resultados. A tabela de trabalho que o Mecanismo de Banco de Dados cria especifica uma ou mais linhas que excedem o limite de 8.060 bytes.

Para obter êxito na execução da consulta, converta qualquer campo longo na lista de seleção nos tipos de dados varchar(max) ou nvarchar(max) usando CAST ou CONVERT. Por exemplo, a consulta a seguir é executada com êxito no SQL Server 2005:

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

Consulte também

Referência

Outros recursos