将数据库从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 1 = 2 THEN 3 ELSE 2 END“
在将数据库兼容模式更改为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
函数没有返回常量表达式。我不知道为什么会出现这个错误。过去两天我一直在谷歌上搜索。
有人想照亮我吗?
提前致谢。非常感谢。
编辑:TimeStamp为int,RegTime为dateTime,例如2009-12-08 17:23:36.267
答案 0 :(得分:0)
我认为问题是LEFT OUTER JOIN
到table3
以及在table3.RegTime
子句中使用ORDER BY
。
如果RegTime
为NULL,则表达式将为常量,无法求值。