行大小错误故障排除
SQL Server 数据库引擎有时在计算表达式前执行排序操作。因此,在 SQL Server 2000 中执行的某些查询可能会在 SQL Server 2008 中返回错误。这些查询通常会指定下列各项:
其结果集中非常长的 char 字段、nchar 字段、varchar 字段以及 nvarchar 字段。
可导致数据库引擎开始执行排序操作的任何子句,如 ORDER BY、GROUP BY 和 DISTINCT 子句;另外还有 SQL Server 查询优化器选择的、使用要求执行排序操作的 Merge Join 算法解决的 JOIN 子句。
数据库引擎可能在计算查询中出现较早的任何表达式前执行排序操作。为此,数据库引擎必须创建一个工作表来存储中间结果。如果此工作表需要创建的任何行超过了 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中失败,因为数据库引擎计算 ORDER BY 子句的时间早于计算 SQL Server 2000 中子句的时间,并且该查询要求在其结果集中有一个非常长的 char 字段。数据库引擎生成的工作表所指定的一行或多行超过了 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