-1

最近,我缩小了本地数据库,大小从 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 项必须出现在选择列表中。

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

我知道,假设我将 order by 更改为 intPriority 问题将得到解决,但不是解决方案。我必须改变我的整个网站。

4

1 回答 1

2

我想你只需要:

ORDER BY intPriority

此外,我认为这与缩小数据库没有任何关系,但也许您也是从 SQL Server 2000 升级的?如果是这样,您可以通过将您的兼容级别回滚到 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;

因此,您可以将数据库的兼容级别设置回 2000,同时您的无效代码将起作用,但您确实应该修复它,因为最终 80 将不是有效的兼容级别(它在 SQL 中不再有效Server 2012)并且因为其他人可能会升级已经运行的服务器上的兼容性级别(因为这通常是升级数据库后推荐的步骤之一)。

于 2012-07-17T14:58:42.723 回答