跳过“N”行并获取所有可用的

时间:2016-07-08 05:47:49

标签: sql sql-server database sql-server-2008 query-performance

我有一个简单的要求,我想跳过'N'行并获取所有avaialbe。我需要这个作为我的存储过程的一部分,如

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

现在我的要求是,如果@TakeRows是某个值,则说-1我想要获取所有行。我试图避免额外的调用来计算行数

4 个答案:

答案 0 :(得分: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是你想要在其间获取的行。

答案 1 :(得分:0)

尝试类似的事情,

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

答案 2 :(得分:0)

$(document).on('change','.cart .quantitycolumn .quantityinput' ,function(){
   var qty = $(this).closest('.tablerow').find('.quantityinput option:selected').val();
   var uuid = $(this).closest('.tablerow').find('.quantityinput').data('uuid');
   var newUUID = $(this).closest('.tablerow').find('.quantityinput').data('newuuid');
   $('[name=quantityValue]').val(qty);
   $('[name=ParentUUID]').val(uuid);
   $('[name=newUUID]').val(newUUID);
});

如果WHERE /*some condition*/ ORDER BY /* some case statement */ OFFSET @SkipRows ROWS FETCH NEXT @TakeRows ROWS ONLY 是一个变量,如果你想返回 ALL ,那么应该给-1行...然后只使用一个单独的查询。

@SkipRows

或使用CASE声明,无论对你有用。

答案 3 :(得分:0)

OFFSET FETCH子句中的FETCH NEXT采用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 Server 2012或更高版本,您可以通过
缩短CASE WHEN IIF(@TakeRows>0,@TakeRows,2147483647)