日期:2014-05-17  浏览次数:20515 次

应该是很简单的事,关于SQL2005的视图浏览不排序问题
首先我用的sql2005的自带Management Studio。
我对一张含有商品名(iName)、价格(iPrice)、价格录入时间(iTime)的表(tPrice)做了一些筛选,建了一个视图(vPrice)。这个视图差不多就是
SELECT * FROM tPrice where iPrice>10000 order by iName,iPrice DESC
这样
但是我在管理器的视图上右键点打开视图的时候,排序是乱的,一定要在sql视图里的SELECT * FROM vPrice 后面手动加上 order by iNamemiPrice DESC 方才排好序。

这尼玛不科学啊~~~~~那我在建视图的时候加的order by给吃了么!!!

------解决方案--------------------
在视图中是不允许有order by的,除非select 中有 top 才行,比如下面的就报错了:

create view dbo.v_wc
as

select *
from sys.objects
order by name desc
go
/*
消息 1033,级别 15,状态 1,过程 v_wc,第 9 行
除非另外还指定了 TOP 或 FOR XML,否则,
ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。
*/


------解决方案--------------------
如果是TOP 100 percent,order by不起作用;如果是top 100,order by 是起作用的吧
------解决方案--------------------
select top 100 percent * from tb order by xxxx 可行的
------解决方案--------------------
我记得2000 视图中排序是好使的,2005以后视图中的order by是不好用的,排序还是写在程序中吧
------解决方案--------------------
引用:
经过大家提醒,总结如下:
原来的select top (100) percent 是乱的;
改成select top 100 percent 也不行;
改成select top 100 可行;

最后的做法:select top 9999999999 可行。
就这样凑合用了还是怎么着?


你这些行或者不行的其实都是不行的。 你看似行的这些,可能由于sql在查询时底层的算法的输出刚好与排序项一致。 下次在别的场合又可能不对。

联机丛书已经很明确的说出了这一点:


ORDER BY 子句仅用于确定视图定义中的 TOP 子句返回的行。ORDER BY 不保证在查询视图时得到有序结果,除非在查询本身中也指定了 ORDER BY。

我们从这句话,得到的结果只能是下面两点:

1,  视图创建语句里的order by 只是为了保证得到的记录按top 的输出,并不是为了排序。
2,  要得到正确的排序,需要在调用视图的查询语句里加order by.


说白了, 等同于以下

select * from (select  top 100 * from ta order by id)
这句话的结果,可能是按id排序,也可能不是。 跟具实际的存储、底层的算法优化都有关系.