我有一个简单的要求,我想跳过“N”行并获取所有可用的。我需要它作为我的存储过程的一部分,例如
WHERE /*some condition*/
ORDER BY
/* some case statement */
OFFSET @SkipRows ROWS FETCH NEXT @TakeRows ROWS ONLY
现在我的要求是如果 @TakeRows 是某个值,比如 -1 我想获取所有行。我试图避免额外的调用来计算行数
你可以这样尝试:
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 是您想要在其间获取的行。
尝试类似的事情,
WHERE /*some condition*/
ORDER BY
/* some case statement */
OFFSET @SkipRows ROWS FETCH NEXT ISNULL(NULLIF(@TakeRows,-1),999999) ROWS ONLY
WHERE /*some condition*/ ORDER BY /* some case statement */ OFFSET @SkipRows ROWS FETCH NEXT @TakeRows ROWS ONLY
如果
@SkipRows
是一个变量,并且如果您想返回 ALL,则应给定行 -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 ROWS FETCH NEXT @TakeRows ROWS ONLY
END
END
或者使用 CASE 语句,无论什么对你有用。