SQL Server别名列不一致行为

时间:2011-08-01 18:39:28

标签: sql sql-server

以下语句适用于SQL Server 2005的一个实例,但在另一个实例(也是SQL Server 2005)上失败,并出现以下错误:

  

已按列表顺序多次指定列。按列表排列的列必须是唯一的。

有谁知道会导致什么?以下是有问题的sql语句的简化版本:

CREATE TABLE #foo (bar INT)


SELECT TOP 150 ID           
FROM                    
(   SELECT  bar as ID,bar FROM  #foo ) tmp
ORDER BY                bar,ID  

6 个答案:

答案 0 :(得分:5)

SELECT @@VERSION;说什么?例如,可以通过在Service Pack中实现的修复来解释不同的行为。在这方面,您应该尽量保持所有环境的一致性。

答案 1 :(得分:2)

总是明确引用与列关联的表是一个好习惯。但在您的情况下,您仍然会返回一列bar两次。不知道你为什么要这样做,但你只需要其中一个订购。

CREATE TABLE #foo (bar INT)


SELECT TOP 150 tmp.ID           
FROM                    
(   SELECT  bar as ID,bar FROM  #foo ) tmp
ORDER BY                tmp.bar

答案 2 :(得分:2)

数据库是否以相同的兼容级别运行?

select name, cmptlevel from master.dbo.sysdatabases

答案 3 :(得分:2)

错误似乎不言自明。

...Columns in the order by list must be unique.

bar和ID是相同的 - 也就是说,它们不是唯一的。

ORDER BY bar,ID

应改为

ORDER BY ID

因为这是你在外部查询中引用它的方式。

PS - 即使出于某种原因,一个系统允许您通过操作复制订单,而另一个系统不允许;你的最佳实践雷达应该指向你不要在任何一个系统上重复它。考虑到订购两次没有收益,因为第二次重复相同的订单操作时订单不会改变。

答案 4 :(得分:0)

您确定查询看起来一样吗?该查询应该在所有版本的SQL Server中导致相同的错误。

数据库的兼容性级别可能会导致行为上的差异,但在这种情况下这不应该有所不同。

答案 5 :(得分:0)

这也是我遇到的错误。您只需将兼容性更改为至少90或更高。本页介绍了如何:

https://msdn.microsoft.com/en-au/library/bb933794.aspx