在SQL Server 2012中按顺序查询别名列

时间:2013-08-22 12:18:38

标签: sql-server-2012-express

我有一个SQL Select查询,它嵌入在一段我不想改变的C#代码中。我的问题是查询在SQLServer 2008上执行得很好,但在2012年没有。

令人讨厌的代码行是:

Select code as SiteCode from TimeSheetContracts S order by S.SiteCode

在SQL2008上的数据库中执行它工作正常。使用以下内容将同一数据库升级为SQLServer 2012错误...

Msg 207, Level 16, State 1, Line 2
Invalid column name 'SiteCode'.

如果我将查询编辑为

Select code as SiteCode from TimeSheetContracts S order by SiteCode

它工作正常。谁能解释一下呢?

1 个答案:

答案 0 :(得分:2)

TimeSheetContracts中没有名为SiteCode的列,因此对s.SiteCode的引用无效。自SQL Server 2000起,ORDER BY中的别名更加严格,因为语法稍微宽容一些。 s.SiteCode在SQL Server 2008实例上运行的唯一方法是,如果您的数据库位于COMPATIBILITY_LEVEL = 80(继续在90或更高的其他数据库上尝试)。移动到SQL Server 2012后,80不再是一个选项。在2005,2008或2008 R2实例上,试试这个:

CREATE DATABASE floob;
GO
USE floob;
GO
CREATE TABLE dbo.SalesOrderHeader(SalesOrderID INT);
GO
SELECT SalesOrderID AS ID FROM dbo.SalesOrderHeader AS h ORDER BY h.ID; -- fails
GO
ALTER DATABASE floob SET COMPATIBILITY_LEVEL = 80;
GO
SELECT SalesOrderID AS ID FROM dbo.SalesOrderHeader AS h ORDER BY h.ID; -- works
GO
USE master;
GO
DROP DATABASE floob;

如果要使用列别名,则需要(并且应该始终使用)别名。如果要使用表别名前缀,则需要使用s.code