OFFSET命令附近的语法不正确

Boh*_*ohn 7 sql t-sql sql-server sql-server-2014

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

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;
Run Code Online (Sandbox Code Playgroud)

我正在使用SQL Server Express 2014

Vla*_*nov 12

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

查看或更改数据库的兼容级别

在T-SQL中,您可以像这样检查:

 USE AdventureWorks2012;  
 GO  

 SELECT compatibility_level  
 FROM sys.databases WHERE name = 'AdventureWorks2012';  
 GO
Run Code Online (Sandbox Code Playgroud)

以下是在不推荐使用sp_dbcmptlevel之后如何检查SQL Server数据库兼容性的兼容级别列表:

 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
Run Code Online (Sandbox Code Playgroud)

此外,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  
    ]  
}
Run Code Online (Sandbox Code Playgroud)

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

[ ORDER BY   
    {  
    order_by_expression   
    [ ASC | DESC ]   
    } [ ,...n ]   
]
Run Code Online (Sandbox Code Playgroud)


Jes*_*ica 5

我的问题是我试图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)
Run Code Online (Sandbox Code Playgroud)

添加一个order by固定的问题:

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

  • 我为OP之外的程序员寻找可能的解决方案给出了这个答案。 (2认同)