【问题标题】:Incorrect syntax near OFFSET commandOFFSET 命令附近的语法不正确
【发布时间】:2017-07-04 23:25:26
【问题描述】:

为什么这不起作用并给我一个“偏移命令附近的语法错误”错误

SELECT o.orderdate, o.orderid, o.empid, o.custid FROM Sales.Orders o
ORDER BY o.orderdate, o.orderid
OFFSET 50 ROWS
FETCH NEXT 25 ROWS ONLY;

我正在使用 SQL Server Express 2014

【问题讨论】:

    标签: sql sql-server tsql sql-server-2014


    【解决方案1】:

    检查数据库兼容级别。 OFFSET 是在 SQL Server 2012 中添加的,因此如果您的数据库处于 2008 兼容模式,则此关键字不可用。

    View or Change the Compatibility Level of a Database

    在 T-SQL 中你可以这样检查:

     USE AdventureWorks2012;  
     GO  
    
     SELECT compatibility_level  
     FROM sys.databases WHERE name = 'AdventureWorks2012';  
     GO
    

    以下是来自How to check SQL Server Database compatibility after sp_dbcmptlevel is deprecated? 的兼容性级别列表:

     65 - SQL Server 6.5
     70 - SQL Server 7.0
     80 - SQL Server 2000
     90 - SQL Server 2005
    100 - SQL Server 2008/R2
    110 - SQL Server 2012
    120 - SQL Server 2014
    130 - SQL Server 2016
    140 - SQL Server 2017
    

    此外,Azure SQL 数据仓库和并行数据仓库不支持OFFSET 子句,从ORDER BY 子句的文档中可以看出:

    -- Syntax for SQL Server and Azure SQL Database  
    
    ORDER BY order_by_expression  
        [ COLLATE collation_name ]   
        [ ASC | DESC ]   
        [ ,...n ]   
    [ <offset_fetch> ]  
    
    <offset_fetch> ::=  
    {   
        OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }  
        [  
          FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY  
        ]  
    }
    

    -- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  
    
    [ ORDER BY   
        {  
        order_by_expression   
        [ ASC | DESC ]   
        } [ ,...n ]   
    ]
    

    【讨论】:

    • 我的兼容级别是 130 (SQL Server 2016),但仍然看到相同的错误。这是 Azure 上的一个 SQL Server DW 实例,如果这有什么不同的话。
    • @shashwat,ORDER BY 子句的文档显示了普通 SQL Server 以及 Azure SQL 数据仓库和并行数据仓库的语法。 DW版本不支持OFFSET子句。
    • 我更改了兼容性级别。但是语法也不正确。正确的语法是 OFFSET 1 ROWS FETCH NEXT 1 ROWS ONLY;我在此页面上的信息有错误dba.stackexchange.com/questions/155998/…
    【解决方案2】:

    我的问题是我试图在视图上使用 OFFSET,但没有加入。

    有问题的查询:

    declare @PageSize int = 25;
    declare @PageNumber int = 1;
    
    with countCte as 
    (
        select count(*) as TotalCount from vw_viewName vn
        where 1=1
    )
    select * from vw_viewName vn
    cross join countCte cou
    where 1=1
    OFFSET @PageSize * (@PageNumber - 1) ROWS
    FETCH NEXT @PageSize ROWS ONLY OPTION (RECOMPILE)
    

    添加order by 解决了问题:

    where 1=1
    order by vn.ID desc
    OFFSET @PageSize * (@PageNumber - 1) ROWS
    FETCH NEXT @PageSize ROWS ONLY OPTION (RECOMPILE)
    

    【讨论】:

    • Op 显然有一个 order by 子句。不知道你为什么给出这个答案。
    • 我为寻找可能解决方案的 OP 以外的程序员提供了这个答案。
    • 那么您的第一段代码仍然无关紧要。无论如何。
    • 感谢这个答案帮助了我。我忘记了 ORDER BY 子句。无视愚者的恶劣态度。
    • 我也忘记了 ORDER BY 子句:-D
    【解决方案3】:

    为这个错误添加一个可能的常见原因(虽然不是 OP 案例):

    缺少ORDER BY 子句。

    【讨论】:

      猜你喜欢
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 2013-12-16
      • 1970-01-01
      • 2013-11-06
      • 2018-02-25
      • 2018-08-14
      相关资源
      最近更新 更多