在MS SQL服务器中使用偏移量和大小写获取



我想有条件地使用偏移量。只有当我的条件满足时才应该使用偏移量获取行。否则,返回整个数据。 但我认为下面的语法是错误的。正确的方法是什么?

DECLARE @page int
set @page = 2
DECLARE @check int
set @check = 2
SELECT * FROM HolonSsoRequest ORDER BY 1 DESC
CASE WHEN @check = 2
THEN
OFFSET @page ROWS FETCH NEXT @page ROWS ONLY;
END

您可以简单地使用IF ... ELSE.

DECLARE @page integer;
DECLARE @check integer;
SET @page = 2;
SET @check = 2;
IF @check = 2
BEGIN
SELECT *
FROM holonssorequest
ORDER BY 1 DESC
OFFSET @page ROWS
FETCH NEXT @page ROWS ONLY;
END
ELSE
BEGIN
SELECT *
FROM holonssorequest
ORDER BY 1 DESC;
END;

或者使用两个CASE表达式,一个用于偏移量,另一个用于计算结果的限制,如果变量未指示限制结果,则计算结果分别为 0 或表中的行数。

SELECT *
FROM holonssorequest
ORDER BY 1 DESC
OFFSET CASE
WHEN @check = 2 THEN
@page
ELSE
0
END ROWS
FETCH NEXT CASE
WHEN @check = 2 THEN
@page
ELSE
(SELECT count(*)
FROM holonssorequest)
END ROWS ONLY;

你拥有的语法在上面到处都是。例如,您的END是在语句末尾(由语句终止符 (;( 定义(之后,并且您尝试使用CASE表达式,就像它是Case(Switch( 语句一样。Case(Switch( 语句在 Transact-SQL 中不存在。

考虑到您的查询的简单性,我个人会做这样的事情,并使用动态语句:

DECLARE @Page int,
@Check int;
SET @page = 2;
SET @Check = 2;
DECLARE @SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
SET @SQL = N'SELECT *' + @CRLF +
N'FROM dbo.HolonSsoRequest' + @CRLF + 
N'ORDER BY {Column Name} DESC' + --Don't use Ordinal Positions: https://sqlblog.org/2009/10/06/bad-habits-to-kick-order-by-ordinal
CASE @Check WHEN 2 THEN @CRLF + N'OFFSET @Page ROWS FETCH NEXT @Page ROWS ONLY;' ELSE N';' END;
--PRINT @SQL; --YOur debugging friend
EXEC sp_executesql @SQL, N'@Page int', @Page;

最新更新