1

У меня есть простое требование. Я хочу пропустить строки «N» и получить все avaialbe. Мне нужно это, как часть моего хранимой процедуры что-то вроде
Пропустите «N» строки и выберите все доступные

WHERE /*some condition*/ 
ORDER BY 
     /* some case statement */  
OFFSET @SkipRows ROWS FETCH NEXT @TakeRows ROWS ONLY 

теперь мое требование, если @TakeRows некоторого значения говорит, -1 я хотел извлечь все строки. Я пытаюсь избежать дополнительного вызова, чтобы вычислить количество строк

+0

Я использую sqlserver2008r2 order by clause является динамическим, для которого у меня уже есть случай stat ement меня больше беспокоит проскакивание и выборка строк. –

+1

Fetch/Offset - зло. http://use-the-index-luke.com/sql/partial-results/fetch-next-page –

+0

ya У меня была эта ссылка раньше, но не была найдена до сих пор с текущим запросом –

ответ

0

Вы можете попробовать так:

WITH x AS 
(
    SELECT col1, col2, 
    ROW_NUMBER() OVER (ORDER BY col1) AS rn 
    FROM YourTable 
) 
SELECT col1, col2 FROM x 
WHERE rn BETWEEN @start AND @End 

Здесь @start и @end являются строками, которые вы хотите, чтобы принести между ними.

+0

запрос, который я опубликовал, является упрощенной версией, и у меня уже есть partioning. Я больше беспокоюсь о пропуске и извлечении части. –

+0

@AnshulNigam: - Как я уже писал, вам просто нужно предоставить значение переменной '@ start' и' @ end', т.е. , строки, которые вы хотите получить.Например, если вы хотите получить строки от 5 до 10, просто добавьте их 5 и 10 соответственно. –

+0

Мое требование - пропустить строки «5» и получить все avaialbe на основе некоторой переменной –

0

попробовать что-то подобное,

WHERE /*some condition*/ 
ORDER BY 
     /* some case statement */  
OFFSET @SkipRows ROWS FETCH NEXT ISNULL(NULLIF(@TakeRows,-1),999999) ROWS ONLY 
+0

с вашим решением. Я могу только выбрать следующий «999999» –

+0

, вы можете настроить число с угадыванием по вашим данным. –

0
WHERE /*some condition*/ 
ORDER BY 
     /* some case statement */  
OFFSET @SkipRows ROWS FETCH NEXT @TakeRows ROWS ONLY 

Если @SkipRows является переменной, и если вы хотите, чтобы вернуть ВСЕ строки должны -1 даваться ... затем просто использовать отдельный запрос.

IF @SkipRows <= 0 
    THEN BEGIN 
      SELECT TOP (@TakeROws) * 
      FROM <table> 
      WHERE <predicate> 
      ORDER BY 
      /* some case statement */  
     END 
    ELSE BEGIN 
      SELECT * 
      FROM <table> 
      WHERE <predicate> 
      ORDER BY /*some case statement*/ 
      OFFSET @SkipRows FETCH NEXT @TakeRows ONLY 
     END 
    END 

Или используйте заявление CASE, независимо от того, что работает для вас.

0

FETCH NEXT в пункте OFFSET FETCH принимает INT или выражение, которое дает INT.

И максимальный размер для INT является 2147483647.

select cast(Power(cast(2 as float),32-1)-1 as int) as max_int; 

Таким образом, мы можем объединить эти факты:

SELECT * 
FROM [Some Table] 
WHERE /*<where clause>*/ 
ORDER BY /*<order by clause>*/ 
OFFSET @SkipRows ROWS 
FETCH NEXT (CASE WHEN @TakeRows > 0 THEN @TakeRows ELSE 2147483647 END) ROWS ONLY; 

с сервером SQL 2012 или выше вы можете сократить тот случай, когда по
IIF(@TakeRows>0,@TakeRows,2147483647)

Смежные вопросы