Dépannage des erreurs de taille de ligne
Le Moteur de base de données SQL Server effectue parfois des opérations de tri avant d'analyser les expressions. Telle est la raison pour laquelle certaines requêtes s'exécutant dans SQL Server 2000 peuvent retourner une erreur dans SQL Server 2008. Ces requêtes spécifient généralement les points suivants :
champs char, nchar, varchar et nvarchar très longs dans leurs jeux de résultats ;
toute clause pouvant conduire le moteur de base de données à démarrer une opération de tri, comme les clauses ORDER BY, GROUP BY et DISTINCT, ainsi que les clauses JOIN que l'optimiseur de requête de SQL Server choisit de résoudre à l'aide d'un algorithme Merge Join nécessitant une opération de tri.
Le Moteur de base de données peut effectuer l'opération de tri avant d'analyser les expressions qui apparaissent plus tôt dans la requête. À cette fin, le moteur de base de données doit créer une table de travail afin de stocker les résultats intermédiaires. Si cette table de travail nécessite la création de lignes dont la taille dépasse 8 060 octets, la requête retourne une erreur.
Imaginons par exemple l'ensemble de tables suivant :
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
Puis, considérons la requête suivante : Cette requête s'exécute dans SQL Server 2000, mais retourne une erreur dans SQL Server 2008 :
SELECT ch+ch, vch1, vch2, vch3
FROM t1, t2
ORDER BY vch1, i;
GO
La requête échoue dans SQL Server 2008 parce que le Moteur de base de données analyse la clause ORDER BY plus tôt qu'il ne le fait dans SQL Server 2000, et parce que la requête demande un champ char très long dans son jeu de résultats. La table de travail créée par le moteur de base de données spécifie une ou plusieurs lignes qui dépassent la limite de 8 060 octets.
Pour exécuter la requête avec succès, convertissez les champs longs de la liste de sélection en types de données varchar(max) ou nvarchar(max) à l'aide de CAST ou de CONVERT. Par exemple, la requête suivante s'exécute sans erreur dans SQL Server 2005 :
SELECT CONVERT(varchar(max),ch+ch), vch1, vch2, vch3
FROM t1, t2
ORDER BY vch1, i;
GO