此简单查询仅在一个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语句中列出的所有列中是唯一的."
我的妈妈说,总是在查询中使用表名/别名来限定 每一列,就像"始终包含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的值.
您可以指定要排序的列的索引:
SELECT Tasks.TaskID
FROM Tasks
INNER JOIN TaskHelpers ON TaskHelpers.TaskID = Tasks.TaskID
order by 1
Run Code Online (Sandbox Code Playgroud)
哇。问题出在数据库兼容模式上。它被设置为“80”(sql 2000)。我已将其设置为 90,查询现在工作正常。
有关兼容性级别的更多信息,请访问: http://msdn.microsoft.com/en-US/library/ms178653 (SQL.90).aspx