我有一个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
它工作正常。谁能解释一下呢?
答案 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
。