一个MS SQL服务器返回错误的查询顺序

时间:2016-09-26 18:34:48

标签: sql-server sql-server-2008 doctrine-orm

我们有多个MSSQL服务器具有相同的数据库副本,下面的查询返回除一个以外的所有服务器的有效顺序,我仔细检查了表的设计,除了几个服务器缺少索引外,所有看起来都相同。

查询由doctrine

生成
WITH dctrn_cte AS (
   SELECT TOP 10 a0_.Priority 
   FROM PROJECTS a0_ 
   WHERE a0_.ProjectID = 1234 
     AND (a0_.Check1 > 0 
          OR 
          a0_.Check2 > 0) 
     AND a0_.Active = 1 
   ORDER BY a0_.Priority DESC) 
   SELECT * 
   FROM (
      SELECT *, ROW_NUMBER() 
      OVER (ORDER BY (SELECT 0)) AS doctrine_rownum FROM dctrn_cte
      ) AS doctrine_tbl 
   WHERE doctrine_rownum BETWEEN 1 AND 10 ORDER BY doctrine_rownum ASC

每次在特定服务器上执行查询时,它都会给出一个随机顺序 - 它完全忽略了ORDER BY部分。

2 个答案:

答案 0 :(得分:5)

您的查询有一个最终ORDER BY子句:doctrine_rownum。这是未确定值的列的别名:

ROW_NUMBER() 
  OVER (ORDER BY (SELECT 0)) AS doctrine_rownum 

因此,结果的任何顺序都是正确的顺序。您的所有服务器都返回正确的结果。 Select isn't broken

PS。您在CTE中也有一个ORDER BY,与最终订单无关,因为它不会对最终结果或doctrine_rownum值施加任何顺序。

  

查询由doctrine

生成

无论此原则是什么,查询都是由学说错误地生成的。

答案 1 :(得分:-2)

添加OPTION (MAXDOP 1)修复了该服务器上的订单。