0

我有一个 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

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

4

1 回答 1

2

TimeSheetContractscalled中没有列SiteCode,因此对的引用s.SiteCode无效。自 SQL Server 2000 以来,别名的ORDER BY使用更加严格,当时的语法更加宽容。在您的 SQL Server 2008 实例上工作的唯一方法s.SiteCode是,如果您的数据库在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.

于 2013-08-22T12:24:45.140 回答