資料列大小錯誤之疑難排解
SQL Server Database Engine 有時候會在評估運算式之前執行排序作業。因此,在 SQL Server 2000 中執行的某些查詢可能會在 SQL Server 2008 中傳回錯誤。這些查詢通常指定如下:
在結果集內指定很長的 char、nchar、varchar 和 nvarchar 欄位。
可造成 Database Engine 開始排序作業的任何子句,例如 ORDER BY、GROUP BY 和 DISTINCT 子句;還有 JOIN 子句,SQL Server 查詢最佳化工具選擇使用需要排序的 Merge Join 演算法來解決它。
Database Engine 可在評估先前出現在查詢中的任何運算式之前執行排序作業。若要這麼做,Database Engine 必須建立工作資料表來儲存中繼結果。如果此工作資料表需要建立超出 8,060 位元組限制的任何資料列,查詢會傳回錯誤。
例如,假設有下列資料表組:
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
現在請考量下列查詢。此查詢是在 SQL Server 2000 中執行,但是在 SQL Server 2008 中傳回錯誤:
SELECT ch+ch, vch1, vch2, vch3
FROM t1, t2
ORDER BY vch1, i;
GO
此查詢在 SQL Server 2008 中失敗,因為 Database Engine 評估 ORDER BY 子句的時間早於它評估 SQL Server 2000 子句的時間,而且因為該查詢在其結果集內要求很長的 char 欄位。Database Engine 建立的工作資料表指定一或多個超出 8,060 位元組限制的資料列。
若要成功執行此查詢,請使用 CAST 或 CONVERT,將選取清單中任何長的欄位轉換成 varchar(max) 或 nvarchar(max) 資料類型。例如,下列查詢在 SQL Server 2005 中成功執行:
SELECT CONVERT(varchar(max),ch+ch), vch1, vch2, vch3
FROM t1, t2
ORDER BY vch1, i;
GO