Revisamos cada escrito en nuestro espacio con el objetivo de enseñarte siempre información certera y actualizada.
Compruebe el nivel de compatibilidad de la base de datos.
OFFSET
se agregó en SQL Server 2012, por lo que si su base de datos está en modo de compatibilidad con 2008, esta palabra clave no está disponible.
Ver o cambiar el nivel de compatibilidad de una base de datos
En T-SQL puedes comprobarlo así:
USE AdventureWorks2012;
GO
SELECT compatibility_level
FROM sys.databases WHERE name = 'AdventureWorks2012';
GO
Aquí hay una lista de niveles de compatibilidad tomados de ¿Cómo verificar la compatibilidad de la base de datos de SQL Server después de que sp_dbcmptlevel esté en desuso?:
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
Además, Azure SQL Data Warehouse y Parallel Data Warehouse no admiten OFFSET
cláusula, como se puede ver en los documentos de la ORDER BY
cláusula:
-- Syntax for SQL Server and Azure SQL Database ORDER BY order_by_expression [ COLLATE collation_name ] [ ASC | DESC ] [ ,...n ] [
] ::= OFFSET integer_constant ROW [ FETCH FIRST integer_constant ROWS ONLY ]
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse [ ORDER BY DESC ] [ ,...n ] ]
Mi problema era que estaba tratando de usar OFFSET
en una vista, pero no se unía.
Consulta problemática:
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)
Agregar un order by
solucionado el problema:
where 1=1
order by vn.ID desc
OFFSET @PageSize * (@PageNumber - 1) ROWS
FETCH NEXT @PageSize ROWS ONLY OPTION (RECOMPILE)