Problembehandlung von Zeilenlängenfehlern

In SQL Server Database Engine (Datenbankmodul) werden vor dem Auswerten von Ausdrücken häufig Sortiervorgänge vorgenommen. Daher können einige in SQL Server 2000 ausgeführte Abfragen einen Fehler in SQL Server 2008 zurückgeben. Diese Abfragen geben in der Regel Folgendes an:

  • Sehr lange char-, nchar-, varchar- und nvarchar-Felder in den jeweiligen Resultsets.

  • Jede beliebige Klausel, die in Database Engine (Datenbankmodul) das Starten eines Sortiervorgangs auslösen kann, wie z. B. die ORDER BY-, GROUP BY- und DISTINCT-Klauseln, sowie JOIN-Klauseln, die der SQL Server-Abfrageoptimierer zum Auflösen mithilfe eines Merge Join-Algorithmus, für den eine Sortierung erforderlich ist, auswählt.

Database Engine (Datenbankmodul) kann den Sortiervorgang vor dem Auswerten sämtlicher Ausdrücke, die früher in der Abfrage angezeigt werden, durchführen. Hierzu muss Database Engine (Datenbankmodul) eine Arbeitstabelle zum Speichern der Zwischenergebnisse erstellen. Wenn für diese Arbeitstabelle das Erstellen von Zeilen erforderlich ist, die die Größenbegrenzung von 8.060 Byte übersteigen, gibt die Abfrage einen Fehler zurück.

Betrachten Sie z. B. die folgende Gruppe von Tabellen:

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

Betrachten Sie nun die folgende Abfrage. Diese Abfrage wird zwar in SQL Server 2000 ausgeführt, gibt aber in SQL Server 2008 einen Fehler zurück:

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

Die Abfrage erzeugt in SQL Server 2008 einen Fehler, da die ORDER BY-Klausel in Database Engine (Datenbankmodul) früher ausgewertet wird als in SQL Server 2000, und die Abfrage ein sehr langes char-Feld im Resultset abfragt. Die in Database Engine (Datenbankmodul) erstellte Arbeitstabelle gibt mindestens eine Zeile an, die die Größenbegrenzung von 8.060 Byte überschreitet.

Konvertieren Sie mithilfe von CAST oder CONVERT alle langen Felder der SELECT-Liste in die varchar(max)- oder nvarchar(max)-Datentypen, um die Abfrage erfolgreich auszuführen. Die folgende Abfrage wird beispielsweise in SQL Server 2005 erfolgreich ausgeführt:

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