Share via


Risoluzione dei problemi relativi agli errori di dimensione delle righe

Data creazione: 5 dicembre 2005

In alcuni casi il Motore di database di SQL Server 2005 esegue alcune operazioni di ordinamento prima di valutare le espressioni. È pertanto possibile che alcune query vengano eseguite correttamente in SQL Server 2000, ma non in SQL Server 2005. Tali query in genere specificano quanto segue:

  • Campi char, nchar, varchar e nvarchar molto lunghi nei relativi set di risultati.
  • Una clausola che può indurre il Motore di database ad avviare un'operazione di ordinamento, ad esempio ORDER BY, GROUP BY e DISTINCT e anche clausole JOIN che Query Optimizer di SQL Server sceglie di risolvere utilizzando un algoritmo Merge Join che richiede l'ordinamento.

Il Motore di database di SQL Server 2005 può eseguire l'operazione di ordinamento prima di valutare le espressioni che compaiono prima nella query. A tal fine, il Motore di database crea una tabella di lavoro in cui archiviare i risultati intermedi. Se tale tabella di lavoro richiede la creazione di righe che superano il limite di 8.060 byte, la query restituisce un errore.

Si consideri, ad esempio, il gruppo di tabelle seguente:

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

Si consideri ora la query seguente. Questa query viene eseguita correttamente in SQL Server 2000, ma restituisce un errore in SQL Server 2005:

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

In SQL Server 2005 la query non viene eseguita correttamente perché la clausola ORDER BY viene valutata da Motore di database prima di quando non venga valutata in SQL Server 2000 e perché il set di risultati della query richiede un campo char molto lungo. Nella tabella di lavoro creata dal Motore di database vengono incluse una o più righe che superano il limite di 8.060 byte.

Per eseguire la query correttamente, convertire i campi lunghi contenuti nell'elenco di selezione nei tipi di dati varchar(max) o nvarchar(max) utilizzando CAST o CONVERT. La query seguente viene ad esempio eseguita senza errori in SQL Server 2005:

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

Vedere anche

Altre risorse

Risoluzione dei problemi relativi alle query
CAST e CONVERT (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005