一个特定服务器上的"不明确的列名称"错误

Ale*_*lex 7 sql sql-server

此简单查询仅在一个db-server上抛出"不明确的列名称TaskID"错误.这是荒唐的.我们在不同的服务器和不同版本的SQL Server(2005/2008)上使用相同的数据库结构对此进行了测试,并且只有这个特定客户端的服务器才会抛出错误.我其实很沮丧.

SELECT Tasks.TaskID
FROM Tasks
INNER JOIN TaskHelpers ON TaskHelpers.TaskID = Tasks.TaskID
ORDER BY TaskID
Run Code Online (Sandbox Code Playgroud)

是的,我知道我可以Tasks.TaskID加入order by条款,但由于某些原因我不能.

Ray*_*Ray 11

如果在sql server 2000上运行查询,或者在兼容级别80或更低级别下运行查询,则会出现模糊列名称错误.在兼容级别为90或更高的sql server 2005/2008上,您的查询运行正常.

从order by子句docs:

"在SQL Server 2005中,合格的列名和别名解析为FROM子句中列出的列.如果order_by_expression不合格,则该值必须在SELECT语句中列出的所有列中是唯一的."


KM.*_*KM. 8

我的妈妈说,总是在查询中使用表名/别名来限定 每一列,就像"始终包含INSERT中的所有列名"一样,并且就像"不要选择*"等.

除了使其更容易,因为它是自我记录源代码,如果您添加/更改列,则可以防止此错误.

检查您的兼容性级别,它们之间存在差异以及ORDER BY的工作原理!

通常,在兼容级别90和更高级别,SQL Server 2008的默认级别,没有表名/别名语句的ORDER BY会产生错误.

ALTER DATABASE兼容级别(Transact-SQL)请参阅部分:兼容级别80和级别90之间的差异

兼容级别设置为80

WHEN将ORDER BY列表中的列引用绑定到SELECT列表中定义的列时,将忽略列歧义,并且有时会忽略列前缀.这可能导致结果集以意外顺序返回.

例如,接受带有单个两部分列(.)的ORDER BY子句,该列用作SELECT列表中列的引用,但忽略表别名.请考虑以下查询.

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

执行时,ORDER BY中将忽略列前缀.排序操作不会按预期在指定的源列(x.c1)上进行; 相反,它发生在查询中定义的派生c1列上.此查询的执行计划显示首先计算派生列的值,然后对计算值进行排序.

兼容级别设置为90

列歧义引起错误.绑定到SELECT列表中定义的列时,不会忽略ORDER BY中指定的列前缀(如果有).

请考虑以下查询.

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

执行时,不会忽略ORDER BY子句中的列前缀.排序操作按预期在指定的源列(x.c1)上进行.此查询的执行计划显示sort运算符对从t_table返回的行进行排序,然后计算SELECT列表中定义的派生列c1的值.


Guf*_*ffa 5

您可以指定要排序的列的索引:

SELECT Tasks.TaskID
FROM Tasks
INNER JOIN TaskHelpers ON TaskHelpers.TaskID = Tasks.TaskID
order by 1
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 4

哇。问题出在数据库兼容模式上。它被设置为“80”(sql 2000)。我已将其设置为 90,查询现在工作正常。

有关兼容性级别的更多信息,请访问: http://msdn.microsoft.com/en-US/library/ms178653 (SQL.90).aspx

  • 您更改了兼容性级别吗?不知道为什么会这样设置?非常糟糕的主意。你可能会破坏很多东西。除非您确实知道可以更改兼容性级别,否则切勿更改它。如果有人在我们的服务器上这样做,他们就会被解雇。 (3认同)