日期:2014-05-19  浏览次数:20329 次

请教高手~~~Sql2000 中 order by 的机制问题。
现在遇到一个问题,   当数据量很大   加上order   by以后会报字节数超长的错误   代码如下:

CREATE   TABLE   t1   (id   INT   IDENTITY(1,1),   c1   VARCHAR(8000))
CREATE   TABLE   t2   (id   INT   IDENTITY(1,1),   c2   VARCHAR(8000))  

INSERT   INTO   t1   (c1)
SELECT   REPLICATE( 'a ',   8000)   UNION   ALL  
SELECT   REPLICATE( 'a ',   8000)   UNION   ALL  
SELECT   REPLICATE( 'a ',   8000)   UNION   ALL  
SELECT   REPLICATE( 'a ',   8000)   UNION   ALL  
SELECT   REPLICATE( 'a ',   8000)   UNION   ALL  
SELECT   REPLICATE( 'a ',   8000)   UNION   ALL  
SELECT   REPLICATE( 'a ',   8000)  

INSERT   INTO   t2   (c2)
SELECT   REPLICATE( 'b ',   8000)   UNION   ALL  
SELECT   REPLICATE( 'b ',   8000)   UNION   ALL  
SELECT   REPLICATE( 'b ',   8000)   UNION   ALL  
SELECT   REPLICATE( 'b ',   8000)   UNION   ALL  
SELECT   REPLICATE( 'b ',   8000)   UNION   ALL  
SELECT   REPLICATE( 'b ',   8000)   UNION   ALL  
SELECT   REPLICATE( 'b ',   8000)  

 
SELECT         *
FROM         t1
                JOIN   t2   ON   t1.id   =   t2.id
ORDER   BY   c1,   c2   desc  


DROP   TABLE   t1
DROP   TABLE   t2


如果上述例子中把order   by   去掉或者换成id     都是对的   。  

我查过文档确实说用order   by对临时表的行size有限制的   。  

但是这里我不明白的是   ,   为什么order   by   还成id   就对了呢?   一行长度也没有变啊   还有文档里说的临时表结构会是什么样的呢?   还有这个问题如何解决比较好呢?

谢谢。



------解决方案--------------------
幫助中有講

使用 ORDER BY 排序資料列
ORDER BY 子句可使用一個或多個資料行 (最多為 8,060 個位元組) 來排序 (Sort) 查詢結果。.如需有關 ORDER BY 子句最大大小的詳細資訊,請參閱 SELECT_SELECT。

排序可為遞增 (ASC,Ascending) 或遞減 (DESC,Descending),若任何順序都沒有指定,將採用 ASC。

------解决方案--------------------
ORDER BY c1, c2 desc

這兩列加起來超過了8,060 個位元組,所以就會報錯。

如果你單獨使用其中一列來排序,就沒有問題。


SELECT *
FROM t1
JOIN t2 ON t1.id = t2.id
ORDER BY c2 desc

SELECT *
FROM t1
JOIN t2 ON t1.id = t2.id
ORDER BY c1

這都是沒有問題的。