使用OFFSET-FETCH,如何将行数默认为“所有行”?

时间:2016-01-13 16:32:13

标签: sql-server tsql stored-procedures sql-server-2012 sql-server-2014

设想一个存储过程,该过程采用@skip(偏移)和@take(要返回的最大行数。如果@takenull,那么我想返回“应用偏移量后的所有行“。

如果@takenull,我可以通过计算表/视图中的行数来实现这一点,但是我必须执行两个查询,这当然不是最佳的。我希望有一个类似于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

2 个答案:

答案 0 :(得分:5)

您可以使用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,则会从表中获得前2 ^ 31-1条记录。

答案 1 :(得分:0)

在您想要所有行的情况下,只需省略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