将 SQL Server 2000 数据库升级到 SQL Server 2008 后,视图未按列分组排序

5 sql-server-2008 sql-server

我有两张桌子

  • 位置大师( [LocatioNo],[LocationName],[Description])
  • 位置数据( [LocationNo],[LocationCode],[DDate],[BillNo],[Model],[Quantity],[SNo])

表格内容
(来源:staticflickr.com
](http://www.flickr.com/photos/77377790@N08/6782618850 “点击查看Flickr”)

以及涉及在 SQL Server 2000 中创建的 2 个表的视图

CREATE VIEW [dbo].[QueryLocation]
AS
  SELECT TOP (100) PERCENT 
       dbo.LocationData.LocationNo, dbo.LocationData.LocationCode, 
       dbo.LocationData.DDate, dbo.LocationData.BillNo, 
       dbo.LocationData.Model,              
       SUM(dbo.LocationData.Quantity) AS Quantity, 
       dbo.LocationMaster.LocationName
  FROM 
       dbo.LocationData 
  INNER JOIN 
       dbo.LocationMaster ON dbo.LocationData.LocationNo = dbo.LocationMaster.LocatioNo 
  GROUP BY 
       dbo.LocationMaster.LocationName, dbo.LocationData.LocationNo, 
       dbo.LocationData.LocationCode, dbo.LocationData.DDate, dbo.LocationData.BillNo, 
       dbo.LocationData.Model ORDER BY dbo.LocationData.BillNo
Run Code Online (Sandbox Code Playgroud)

在 SQL Server 2000 中执行以下查询时,网格中的结果按billno列排序。

SELECT *  FROM QueryLocation
Run Code Online (Sandbox Code Playgroud)

查询结果
(来源:staticflickr.com
](http://www.flickr.com/photos/77377790@N08/6782618858 “点击查看 Flickr”)

升级到 SQL Server 2008 后,执行时相同的查询未按账单无字段排序

建议为什么这不在 group by 列上排序

提前致谢

小智 11

ORDER BY 视图中只是一个损坏的“功能”(尽管企业经理似乎鼓励这种功能)。

在大多数情况下,视图意味着与表无法区分。表没有固有的顺序。

这意味着 an 唯一ORDER BY能保证影响结果返回顺序的地方是在最外面SELECT——即引用这个视图的那个(假设那个SELECT,反过来,不在另一个视图或 UDF 中)

一个视图中,UDF 等ORDER BY只是为了它的其他/重载目的而工作 -TOP有意义 - 即没有ORDER BY,要求TOP 10将定义不明确,因为同样,表没有固有的顺序。


不幸的是,有一个共同的错误看法,即这工作,因为在企业管理器和Management Studio中的图形视图设计师实际上鼓励了-有“排序”功能包括有,如果你使用它们,刀具刀片 TOP 100 PERCENTORDER BY-尽管这有至少从 2005 年起就行不通了。


刚刚重新阅读的问题-它是依托于订单GROUP BY?这使一个问题与另一个问题复杂化。不能保证涉及 a 的语句的输出GROUP BY具有任何特定顺序。


Aar*_*and 5

在 SQL Server 2012 中,如果您尝试使用视图设计器创建有序视图,则会收到以下警告:

警告:ORDER BY 子句仅用于确定视图定义中的 TOP 子句返回的行。ORDER BY 子句不保证查询视图时的有序结果,除非在查询本身中也指定了 ORDER BY。单击取消以放弃您的修改。单击“确定”保存视图。

我不确定在 2008/2008 R2 的最新版本中是否会发生这种情况。

虽然我认为继续允许语法是绝对愚蠢的,并且让视图设计者延续这种类型的排序意味着除了过滤器(当 TOP = 100% 时不包括 0 行)之外的任何东西的神话,这就是他们认为的“固定”根据以连接编号249248。我已经发表评论寻求确认,但主要是我的观点是保存警告不够好。如果我只是使用视图设计器来生成 SQL,然后我将把它粘贴到其他地方的CREATE VIEWALTER VIEW脚本中怎么办?

无论如何,在这个和其他错误中发现的措辞,以及这里的其他答案,应该确认你的逻辑是错误的:ORDER BY/GROUP BY在视图中绝对没有保证优化器如何从视图中返回行。即使在视图使用之外的查询中GROUP BY,这不会规定排序。如果你想保证顺序,你绝对必须申请ORDER BY最外层的查询。如需更多阅读,请参阅此博客文章


Dav*_*kle 4

它没有排序,因为按视图排序是不合法的。事实上,如果您尝试在没有 TOP (100) PERCENT 语句的情况下对视图上的列进行 ORDER BY,您将收到错误。为什么 SQL Server 允许 TOP 和 ORDER BY?因为如果您要选择 100% 以外的任何行,则 ORDER BY 本质上将与 TOP 结合使用来过滤行。

为什么 SQL 2000 允许这样做?这是 SQL 2000 优化器的一个特性,并且您的不合规代码“侥幸逃脱”。可以这样想——SQL 2008(2005 也表现出了这种行为)的设计者必须做出选择,他们是否要让视图运行得更快并忽略这样的代码,或者是否要减慢速度向下视图执行只是为了支持无效的编码结构。

这个故事的寓意是,您不能对视图进行 ORDER BY——您永远无法真正做到。所有 ORDER BY 语句必须由查询视图本身的查询执行。

您可以尝试一些技巧,但只有在您绝对无法更新查询视图的代码时才可以使用它们。我不会依赖它们或推荐它们进行任何未来或当前的开发。