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

Posted

技术标签:

【中文标题】LAG 不是公认的内置函数名称【英文标题】:LAG is not a recognized built in function name 【发布时间】:2016-07-12 20:43:49 【问题描述】:

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

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);

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

消息 195,级别 15,状态 10,过程 GetDurationFree,第 6 行 “LAG”不是可识别的内置函数名称。

消息 156,级别 15,状态 1,过程 GetDurationFree,第 12 行 关键字“ORDER”附近的语法不正确。

我正在网上阅读,有人提出以下建议:

ALTER DATABASE yourDBName
SET COMPATIBILITY_LEVEL = 110

但是,当我运行它时,我收到以下错误:

消息 15048,第 16 级,状态 1,第 1 行 数据库兼容级别的有效值为 80、90 或 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)

【问题讨论】:

您可能正在为 SSMS 运行 SQL Server 2014,但您正在与之通信的数据库是 SQL Server 2008。 刚刚编辑,你们是对的,现在是 2008 年,我该如何更改? LAG 是 SQL Server 2012 引擎中的新函数 - 因为您运行的是 2008 版本,所以不能使用此函数用过。 @George 您需要升级服务器软件。 只需在您的计算机上安装更新版本的 SQL Server 数据库引擎(不仅仅是 GUI 管理工具)并针对该实例运行 【参考方案1】:

我最终做的是进入卸载程序下的控制面板并删除与 SQL 相关的所有内容。然后我重新安装了程序,它工作正常。

我注意到计算机上没有安装 2008 的早期版本。也许问题出在那儿。

【讨论】:

【参考方案2】:

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

ALTER DATABASE DBName
SET COMPATIBILITY_LEVEL = 110

【讨论】:

以上是关于LAG 不是公认的内置函数名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 2012 中使用 TRUNC 函数,因为我得到 'TRUNC' 不是一个公认的内置函数名称。'?

TimeValue 不是可识别的内置函数名称

STRING_AGG 不是可识别的内置函数名称

sql server 中 使用lead() over()函数报错:lead无法识别的内置函数。

“矩阵是不是包含值 X?”的函数

为啥在sql sever中使用first和last函数查询,提示‘first’'last' 不是可以识别的 内置函数名称。