在 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.RegTime
是NULL
怎么办?它用于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 JOIN
到table3
以及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 版本