在 90 或更高版本的兼容模式下,ORDER BY 子句中不允许使用常量表达式

Posted

技术标签:

【中文标题】在 90 或更高版本的兼容模式下,ORDER BY 子句中不允许使用常量表达式【英文标题】:Constant expressions are not allowed in the ORDER BY clause in 90 or later compatibility modes 【发布时间】:2016-08-11 09:43:22 【问题描述】:

将数据库从 SQL Server 2014 升级到 SQL Server 2016。升级顾问说我有一个视图给我这个问题:

Object [dbo].[view_PHistory] ​​使用一个常量表达式,它是 在数据库兼容级别 90 的 ORDER BY 子句中不允许 或更高版本。

在 ORDER BY 子句中允许(并忽略)常量表达式 当数据库兼容模式设置为 80 及更早版本时。 但是,ORDER BY 子句中的这些表达式会导致 当数据库兼容模式设置为 90 或 稍后。

以下是此类有问题的陈述的示例:

SELECT * FROM Production.Product ORDER BY CASE WHEN 1=2 THEN 3 ELSE 2 结束”

在将数据库兼容模式更改为 90 或更高版本之前, 修改在 ORDER BY 子句中使用常量表达式的语句 使用列名或列别名,或非负整数 表示名称或别名在选择列表中的位置。

这是我的看法:

ALTER VIEW [dbo].[vw_PHistory]
AS
    SELECT  
        table1.SerialNo,
        ROW_NUMBER() OVER (PARTITION BY table1.SerialNo 
                           ORDER BY DATEADD(ms, table2.TimeStamp, table3.RegTime) DESC) AS LatestPoll    
    FROM    
        table1 
    INNER JOIN
        table2 ON table2.SerialNo = table1.SerialNo
               AND table2.Counted = 1 
    LEFT OUTER JOIN
        table3 ON table3.scanID = table2.scanID

此视图在兼容级别为120的SQL Server 2014上运行没有问题。

当我将ORDER BY DATEADD 函数与特定列名交换时,升级顾问的错误提示消失了。

此外,我知道DATEADD 函数没有返回常量表达式。我不知道为什么会出现这个错误。过去 2 天我一直在谷歌搜索。

有人愿意在这方面给我启发吗?

提前致谢。非常感谢。

编辑:TimeStamp 是 int,RegTime 是 dateTime,例如 2009-12-08 17:23:36.267

【问题讨论】:

如果table3.RegTimeNULL 怎么办?它用于LEFT OUTER JOIN,你不能ORDER BY NULL 能否显示 table2.TimeStamp 和 table3.RegTime 列的定义? @Sergey 嗨,Sergey,TimeStamp 是整数,而 RegTime 是 dateTime,例如 2009-12-08 17:23:36.267 这似乎只是一个错误。我建议删除视图,升级数据库然后再次创建视图。如果创建时不会出现错误,那么我会把它扔掉。 @Sergey 我还是打算升级。之后我只需要运行更多测试以确保一切正常。将在适当的时候更新帖子。 【参考方案1】:

我认为问题在于LEFT OUTER JOINtable3 以及ORDER BY 子句中table3.RegTime 的使用。 如果RegTime 为NULL,则表达式将是一个常量,无法计算。

【讨论】:

我正在与 Sergey 的 cmets 一起工作。当我发现问题时会更新这篇文章。谢谢。 如果它是可以对每一行进行不同评估的东西,无论如何都不是一个“常数”。既不常用,也不属于 SQL Server 用语的任何特殊性。 欣赏评论。你能用更外行的术语详细说明吗?我在 SQL 方面不是特别有经验。 @Damien_The_Unbeliever

以上是关于在 90 或更高版本的兼容模式下,ORDER BY 子句中不允许使用常量表达式的主要内容,如果未能解决你的问题,请参考以下文章

由于 3.4.4 包不兼容,将 R 更新到 4.0 或更高版本?格维兹

检查 iOS 版本是不是与 PHP 兼容,从 iOS 3.0 到 IOS 4.0 或更高版本

在Android 1.0或更高版本中使Android项目Gradle兼容

库版本不兼容:nokogiri.bundle 需要 8.0.0 或更高版本,但 libiconv.2.dylib 提供 7.0.0 版本

我更新了 taget 版本,但我的 App on Store 的兼容性仍然是“Ios 11 或更高版本”

不兼容的库版本:imagick.so 需要 18.0.0 或更高版本,但 libfreetype.6.dylib 在第 0 行的 Unknown 中提供了 16.0.0 版本