Udostępnij za pośrednictwem


Troubleshooting Row Size Errors

The SQL Server Database Engine sometimes performs sort operations before it evaluates expressions.Dlatego niektóre kwerendy, które są wykonać w SQL Server 2000 mogą zwracać błąd w SQL Server 2008. Zazwyczaj te kwerendy określić następujące czynności:

  • Bardzo długie char, nchar, varchar, a nvarchar pola w zestawach ich wyników.

  • klauzula, które mogą być przyczyną Database Engine Aby rozpocząć operację sortowania, takich jak ORDER BY, GROUP BY i klauzul DISTINCT; a także łączyć klauzule, SQL Server optymalizator kwerendy wybiera rozwiązać przy użyciu Merge Join algorytm, który wymaga sortowania.

The Database Engine may perform the sort operation before evaluating any expressions that appear earlier in the query.Aby to zrobić, Database Engine należy utworzyć worktable do przechowywania wyniki pośrednich. Jeśli to worktable wymaga utworzenia wszystkie wiersze, które przekraczają limit 8,060 bajtów, kwerenda zwraca błąd.

Na przykład rozważmy następujący zestaw tabel:

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

Teraz należy wziąć pod uwagę następujące kwerendy.Wykonuje kwerendy w SQL Server 2000 Zwraca błąd, ale SQL Server 2008:

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

Kończy się niepowodzeniem w SQL Server 2008 ponieważ Database Engine oblicza ORDER BY Klauzula wcześniej niż wartość w klauzuli SQL Server 2000, a ponieważ bardzo długich żądania kwerendy char pole w jego zestawie wyników. The worktable Database Engine kompilacje określa jeden lub więcej wierszy, które przekroczyły limit 8,060 bajtów.

Aby pomyślnie uruchomić kwerendę, konwertować wszystkie pola długiej liście select, aby varchar(max) lub nvarchar(max) typy danych przy użyciu CAST lub CONVERT. Na przykład poniższa kwerenda pomyślnie wykonuje w SQL Server 2005:

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