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

时间:2016-08-11 09:43:22

标签: sql sql-server sql-server-2014 sql-server-2016

将数据库从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

1 个答案:

答案 0 :(得分:0)

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