【发布时间】:2010-04-09 22:13:41
【问题描述】:
我在 SQL 中创建了一个由 3 个表组成的简单视图。
通过右键单击并选择设计,在对象资源管理器表中,我修改了我的自定义视图。我刚刚在一个字段中添加了 sortby asc。
问题是变化没有反映在视图的输出中。 保存视图并选择打开视图后,排序不会显示在输出中。
那么这里发生了什么?
【问题讨论】:
标签: sql sql-server-2005 ssms sql-view
我在 SQL 中创建了一个由 3 个表组成的简单视图。
通过右键单击并选择设计,在对象资源管理器表中,我修改了我的自定义视图。我刚刚在一个字段中添加了 sortby asc。
问题是变化没有反映在视图的输出中。 保存视图并选择打开视图后,排序不会显示在输出中。
那么这里发生了什么?
【问题讨论】:
标签: sql sql-server-2005 ssms sql-view
从技术上讲,可以将排序烘焙到VIEW,但非常不鼓励这样做。相反,您应该在从视图中选择时应用排序,如下所示:
Select ...
From MyView
Order By SortByCol ASC
如果你真的想知道(但我强烈建议不要这样做),你可以使用 TOP 命令来绕过视图中排序的限制:
Select TOP 100 PERCENT * Col1, Col2....
From Table1
Order By SortByCol ASC
【讨论】:
看来:
SQL Server 2000、SQL 2005 和 SQL 2008 中的视图定义中的 SELECT 子句有限制。CREATE VIEW 语句不能包含 ORDER BY 子句,除非 SELECT 的选择列表中还有 TOP 子句陈述。 ORDER BY 子句仅用于确定视图定义中 TOP 子句返回的行。 ORDER BY 子句不保证查询视图时的有序结果,除非在查询本身中也指定了 ORDER BY。
还有一个需要应用的修补程序。之后,您应该使用 Top 100% 来确保 order by 有效。
HTH
【讨论】:
一般情况,视图是不能排序的。
(正如其他人提到的,有一个 hack 可以做到这一点,但由于您使用的是可视化查询设计器而不是用 SQL 编写视图定义,因此可能很难实现该 hack。)
您实际上并没有“修改”您的视图,您只是更改了 EM 用来从您的视图中选择 的 SELECT 语句。视图定义中不保留排序设置。
当您关闭选项卡时,EM 不会记住您对该视图的排序偏好,因此当您再次打开该视图时,它会按照 SQL Server 决定的顺序显示。
【讨论】: