使用 OFFSET-FETCH,如何将行数默认为 "all rows"?

Using OFFSET-FETCH, how to default number of rows to "all rows"?

设想一个存储过程,它采用 @skip(偏移量)和 @take(最大行数到 return。如果 @takenull,那我想 return "all rows after applying the offset".

如果 @takenull,我可以通过计算 table/view 中的行数来完成此操作,但是我必须执行两个查询,当然,这不是最佳的。我希望有一个类似于 FETCH [NEXT] ALL ROWS.

的选项
DECLARE @skip BIGINT = 0;
DECLARE @take BIGINT = NULL;

IF (@take IS NULL) SET @take = (SELECT COUNT(*) FROM SomeTable);

SELECT *
FROM SomeTable
ORDER BY SortOrder
OFFSET @skip ROWS
FETCH NEXT @take ROWS ONLY

如果您想要所有行,只需省略 FETCH

DECLARE @skip BIGINT = 0;
DECLARE @take BIGINT = NULL;

IF (@take IS NULL)
BEGIN
    SELECT *
    FROM SomeTable
    ORDER BY SortOrder
    OFFSET @skip ROWS
END
ELSE
BEGIN
    SELECT *
    FROM SomeTable
    ORDER BY SortOrder
    OFFSET @skip ROWS
    FETCH NEXT @take ROWS ONLY
END

你可以使用 COALESCE:

DECLARE @skip BIGINT = 0;
DECLARE @take BIGINT = NULL;

SELECT *
FROM SomeTable
ORDER BY SortOrder
OFFSET COALESCE(@skip,0) ROWS
FETCH NEXT COALESCE(@take,0x7ffffff) ROWS ONLY

LiveDemo

0x7ffffff2147483647 最大 INT 值相同。

当未提供 @skip@take 时,它将从 table.

中获取前 2^31-1 条记录