SQL SERVER 2016 OFFSET

Я хочу сделать два запроса, первый должен принести мне первые 18 данных с топ-18 продаж. Но второй должен принести мне следующие 18, но у сервера sql нет функции limit, и он говорит, что он заменяет смещение, но sql не воспринимает его как «неправильный синтаксис рядом с« offset »»

. временная таблица выполняет запрос, а затем извлекает данные с помощью select row_number. Но это кажется чрезмерным для консультации, я также должен отнести ее к яшме, и чем проще, тем лучше.

Я ценю любую информацию о функции, которая помогает мне сделать следующую «n» запись запроса, минуя его первую «m».

introducir la descripción de la imagen aquí

0
задан 27.11.2019, 15:15
1 ответ

Привет друг возможно был меньшей версией в 2012 в этом случае не существует ОФСЕТ в этом случае ты можешь основываться ROW_NUMBER и переменных, чтобы выбирать то, что ты желаешь, я показываю тебя, как, и если ты нравишься, ты это можешь направлять sp и так это работать привет.

--Creamos la tabla de prueba llamada Customers
DECLARE @Customers TABLE (
    FirstName VARCHAR(50), 
    LastName  VARCHAR(50),
    PhoneNumber VARCHAR(10),
    EmailAddress VARCHAR(50),
    CreationDate DATETIME
)
--Llenamos MIL de datos
;WITH L0 AS (SELECT 1 c FROM(SELECT 1 UNION ALL SELECT 1)c(D)),
      L1 AS (SELECT 1 C FROM L0 CROSS JOIN L0 AS B),
      L2 AS (SELECT 1 C FROM L1 CROSS JOIN L1 AS B),
      L3 AS (SELECT 1 C FROM L2 CROSS JOIN L2 AS B),
      L4 AS (SELECT 1 C FROM L3 CROSS JOIN L3 AS B),
      L5 AS (SELECT 1 C FROM L4 CROSS JOIN L4 AS B),
      L6 AS (SELECT 1 C FROM L5 CROSS JOIN L5 AS B) --SUFICIENTE PARA UN MILLON

INSERT INTO @Customers (FirstName, LastName, PhoneNumber, EmailAddress, CreationDate)
SELECT TOP 1000 REPLACE(NEWID(),'-',''), REPLACE(NEWID(),'-',''), 
    CAST( CAST(ROUND(RAND(CHECKSUM(NEWID()))*1000000000+4000000000,0) AS BIGINT) AS VARCHAR(10)),
    REPLACE(NEWID(),'-','') + '@gmail.com',     
    DATEADD(HOUR,CAST(RAND(CHECKSUM(NEWID())) * 19999 as INT) + 1 ,'2006-01-01')
FROM L6

DECLARE
@InitialRow INT=0--Donde iniciara puede ser 10,20,30 etc
,@RowsRetrieve INT=10--cuantos quieres 10,20 30 es decir si mandamos 

--@InitialRow=0 y @RowsRetrieve =10 nos devolvera del 1 al 10 si mandamos 
--@InitialRow=10 y @RowsRetrieve =10 nos devolvera del 11 al 20 asi sucesivamente.

--Asigamos que sigue
DECLARE @lFirstRec INT,
@lLastRec INT,
@lTotalRows INT
SET @lFirstRec = ( @InitialRow)
SET @lLastRec = ( @InitialRow + @RowsRetrieve + 1 )
SET @lTotalRows = @lFirstRec - @lLastRec + 1

--prueba empezando del 1 al 10
;WITH CTE AS (
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS ROWNUM,* FROM @Customers)
SELECT * FROM CTE
WHERE ROWNUM > @LFIRSTREC AND ROWNUM < @LLASTREC

Здесь пример здесь ты можешь играть с параметрами для того, чтобы ты увидел, как оно функционирует.

https://dbfiddle.uk/? rdbms=sqlserver_2017& fiddle=8c11361399692901fe9678362bd00134

0
ответ дан 01.12.2019, 10:46