最近,我缩小了本地数据库,并将大小从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而不是问题会解决,但它不是解决方案。我必须在整个网站上进行更改。
答案 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之一)。