LAG 不是公认的内置函数名称

LAG is not a recognized built in function name

我有一个创建以下存储过程的脚本:

CREATE PROCEDURE [dbo].[GetDurationFree] 
    @EquipmentName varchar(50)
AS
    UPDATE dbo.EquipmentMessages
    SET UnlockDuration = (SELECT DATEDIFF (SECOND, 
                (SELECT TOP 1 LAG(TimeUnlock) OVER (ORDER BY TimeUnlock) TimeUnlock
                    FROM dbo.EquipmentMessages
                    WHERE EquipmentName = @EquipmentName
                    ORDER BY TimeLock DESC), 
                (SELECT TOP 1 TimeLock FROM dbo.EquipmentMessages
                    WHERE EquipmentName = @EquipmentName
                    ORDER BY TimeLock DESC)))
    WHERE TimeLock = (SELECT MAX(TimeLock) FROM dbo.EquipmentMessages
                    WHERE EquipmentName = @EquipmentName);

唯一的问题是它使用了延迟,当我尝试执行它时出现以下错误:

Msg 195, Level 15, State 10, Procedure GetDurationFree, Line 6
'LAG' is not a recognized built-in function name.

Msg 156, Level 15, State 1, Procedure GetDurationFree, Line 12
Incorrect syntax near the keyword 'ORDER'.

我在网上阅读,有人建议如下:

ALTER DATABASE yourDBName
SET COMPATIBILITY_LEVEL = 110

然而,当我 运行 这个时,我得到以下错误:

Msg 15048, Level 16, State 1, Line 1
Valid values of the database compatibility level are 80, 90, or 100.

我是运行宁

SQL Server 2014 Management Studio,速成版

但是当我输入以下内容时 SELECT @@version

我得到:

Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64) 
Mar 29 2009 10:11:52 
Copyright (c) 1988-2008 Microsoft Corporation
Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

我最后做的是在卸载程序下进入控制面板并删除与 SQL 有关的所有内容。然后我重新安装程序,它运行良好。

我注意到电脑上有一个2008的早期版本没有安装。也许问题出在这里。

您需要 SQL 兼容级别为 110 的 Server 2012 数据库才能使用 LAG 功能。

ALTER DATABASE DBName
SET COMPATIBILITY_LEVEL = 110