【问题标题】:Query referencing aliased column in order by in SQLServer 2012在 SQL Server 2012 中按顺序查询引用别名列
【发布时间】:2013-08-22 12:18:38
【问题描述】:

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

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

【问题讨论】:

    标签: sql-server-2012-express


    【解决方案1】:

    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多