drd*_*rdn 0 sql sql-server stored-procedures
我有一个看起来像这样的存储过程:
CREATE PROCEDURE sample_sp
(
@StartCreateDate NVARCHAR(30)= NULL,
@EndCreateDate NVARCHAR(30)= NULL,
@Name NVARCHAR(255) = NULL,
@Offset INT = 1,
@PageSize INT = 10
)
As
BEGIN
SET NOCOUNT ON;
SELECT * FROM sample_table
WHERE
(@StartCreateDate IS NULL OR [created_at] >= @StartCreateDate)
AND
(@EndCreateDate IS NULL OR [created_at] <= @EndCreateDate)
AND
(@NAME IS NULL OR [name] = @Name)
ORDER BY id
OFFSET (@Offset)*@PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY
END
Run Code Online (Sandbox Code Playgroud)
执行命令是
EXEC sample_sp @Name = N'????'
Run Code Online (Sandbox Code Playgroud)
我在字符串值之前使用的执行命令中也定义了NameasNVARCHAR(255)和N,但仍然没有检索到任何内容。另一方面,当我使用时,
SELECT * FROM sample_table WHERE name = N'????'我得到了正确的记录。
我想知道我的存储过程或什至我的执行命令有什么问题?
问题在于这个OFFSET计算:
OFFSET (@Offset)*@PageSize ROWS
Run Code Online (Sandbox Code Playgroud)
使用默认值(偏移量 1,页面大小 10),该值将为 10,因此除非 11 行或更多行符合其他条件,否则不会返回任何行。
如果要将@Offset 视为页码,则为偏移量计算减 1:
OFFSET (@Offset-1)*@PageSize ROWS
Run Code Online (Sandbox Code Playgroud)
此外,请考虑对表中的参数和列使用强类型的日期时间类型。