Risoluzione dei problemi relativi agli errori di dimensione delle righe

In alcuni casi il Motore di database di SQL Server 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 2008. 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 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 2008:

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

In SQL Server 2008 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