缩小数据库后,order by子句不起作用

时间:2012-07-17 14:51:03

标签: sql-server-2008

最近,我缩小了本地数据库,并将大小从6gb减少到1mb。

但是在那之后一些查询不起作用,那些已经在开发和实时服务器上工作(在本地,开发和实时sql版本是相同的)。

此查询之一是

SELECT a.col1,
       b.col2,
       isnull(a.intPriority, 100) AS intPriority
FROM   tab1 a
       INNER JOIN tab2 b
         ON a.id = b.id
UNION
SELECT a.col1,
       b.col2,
       isnull(a.intPriority, 100) AS intPriority
FROM   tab1 a
       INNER JOIN tab2 b
         ON a.id = b.id
ORDER  BY a.intPriority 

此查询给我一个错误:

  

如果语句包含UNION,INTERSECT或EXCEPT运算符,则ORDER BY项必须出现在选择列表中。

以上查询在开发和实时服务器上运行良好,为什么不在本地?

我知道,假设我将顺序改为intPriority而不是问题会解决,但它不是解决方案。我必须在整个网站上进行更改。

1 个答案:

答案 0 :(得分:2)

我认为你只需要:

ORDER BY intPriority

此外,我不认为这与缩小数据库有任何关系,但也许你也从SQL Server 2000升级了?如果是这样,你可以"得到"同时将你的compat级别回滚到2000.只是为了演示,在SQL Server 2008上:

SELECT name = COALESCE(a.name, '') FROM sys.objects AS a
UNION ALL
SELECT name = COALESCE(a.name, '') FROM sys.objects AS a
ORDER BY a.name;

失败:

  

如果语句包含UNION,INTERSECT或EXCEPT运算符,则ORDER BY项必须出现在选择列表中。

但是在设置之后工作:

ALTER DATABASE my_db SET COMPATIBILITY_LEVEL = 80;

因此,您可以将数据库的compat级别设置为2000,同时您的无效代码将起作用,但您确实应该修复它,因为最终80将无法成为有效的兼容级别(它是在SQL Server 2012中不再有效)并且因为其他人可能会在已经工作的服务器上升级兼容级别(因为这通常是recommended steps after upgrading a database之一)。