使用 OFFSET-FETCH,如何将行数默认为 "all rows"?
Using OFFSET-FETCH, how to default number of rows to "all rows"?
设想一个存储过程,它采用 @skip
(偏移量)和 @take
(最大行数到 return。如果 @take
是 null
,那我想 return "all rows after applying the offset".
如果 @take
是 null
,我可以通过计算 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
0x7ffffff
与 2147483647
最大 INT
值相同。
当未提供 @skip
和 @take
时,它将从 table.
中获取前 2^31-1 条记录
设想一个存储过程,它采用 @skip
(偏移量)和 @take
(最大行数到 return。如果 @take
是 null
,那我想 return "all rows after applying the offset".
如果 @take
是 null
,我可以通过计算 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
0x7ffffff
与 2147483647
最大 INT
值相同。
当未提供 @skip
和 @take
时,它将从 table.