我 有 一 个 返回 两 列 * * Ticket _ Id * * 和 * * Price * * 的 视图 。 每张 票 最 多 可以 有 2 个 不同 的 价格 。 除 此 之外 , 我 还有 一 个 存储 过程 , 它 根据 分页 的 输入 参数 将 数据 从 视图 返回 给 调用 者 。
@page : indicates the page number
@pageSize : indicates the number of records per page.
中 的 每 一 个
当 一 个 用户 请求 100 行 ( 唯一 票据 ) 时 , 我 将 不得 不 返回 最 多 200 行 数据 。
x1月 1 日
但是 它 只 返回 100 行 数据 , 包括 重复 的 数据 。 有 没有 办法 修改 分页 参数 来 检索 所有 200 行 数据 ?
示例 : 视图 返回 如下 :
| 票证 标识|标价|
| - -| - -|
| 票证 1| 10 个|
| 票证 1|十二|
| 票证 2|十一|
| 票证 2|十三|
| 票证 3|十二|
| 票证 3|十四|
当 用户 用 输入 参数 请求 时 :
@page = 1 , @PageSize = 3
格式
我 需要 返回 所有 6 行 数据 。
- 视图 ( 使用 视图 是 因为 存储 过程 不能 直接 访问 票证 表 ) * *
select tck.ticket_id, tck.cost as 'price'
--,RANK() OVER(ORDER BY tck.ticket_id) 'Rank'
from tickets tck with (NOLOCK)
格式
存储 过程 :
ALTER PROCEDURE [dbo].[p_trans_history_srch]
-- Add the parameters for the stored procedure here
@page int=1, --optional
@pageSize int=20 --optional
AS
BEGIN
declare @finalsqlstmt nvarchar(max)
declare @pageString nvarchar(max)
declare @pageCount nvarchar(max) = ''
declare @viewName nvarchar(max)
set @pageString =concat(' OFFSET ', @pageSize,' * (',@page,' - 1) ROWS FETCH NEXT ', @pageSize,' ROWS ONLY')
set @finalsqlstmt = concat('select * from ',dbo.f_get_dbname(),@viewName,'where ',@search ,' and created_date between ''',@startDate,''' and ''',@endDate,''' order by created_date desc ',@pageString)
set @pageCount =concat('select count(distinct ticket_id) from ',dbo.f_get_dbname(),@viewName,'where ',@search,' and created_date between ''',@startDate,''' and ''',@endDate,'''' )
exec (@finalsqlstmt)
exec (@pageCount)
END
格式
- 注意 : 我 尝试 使用
RANK() OVER(ORDER BY ticket_id) 'Rank'
并 根据 排名 返回 数据 , 但 由于 表 太 大 , 查询 性能 急剧 下降 。 * *
- 注意 : 我 尝试 使用
1条答案
按热度按时间iugsix8n1#
如果将两个价格转换为两列(例如“A”和“B”),您可以得到“100行”。我不知道这在您的情况下是否是一个选项,但这里有一个示例:
否则,如果总是得到所需行数的一半,是否可以将用户提供的页面大小乘以2?