您可以在 TSQL 中使用伪随机数来生成可重现的随机值列表。
从 的计算中删除注释分隔符@Seed
将导致序列随着 的每个新值而变化@LastLogin
。
-- Some user specific value that does not change.
declare @UserId as Int = 42
-- Some user specific value that changes as often as you want the order to change for a user.
declare @LastLogin as DateTime = SysDateTime()
-- Paging parameters.
declare @PageSize as Int = 10
declare @PageNumber as Int = 2
select @UserId as Seed, @UserId + DatePart( ms, @LastLogin ) as AlternativeSeed, @LastLogin as LastLogin
declare @Seed as Int = @UserId -- + DatePart( ms, @LastLogin )
; with Numbers ( Number, PseudorandomNumber ) as (
-- Select the "first" row from your data.
select 1, Rand( @Seed )
union all
-- Add the "next" row from your data.
select Number + 1, Rand( 1000000 * PseudorandomNumber )
from Numbers
where Number < 100
),
-- Add row numbers to the previous rowset to allow paging.
NumbersWithRowNumber as (
select *, Row_Number() over ( order by PseudorandomNumber ) as RowNumber
from Numbers
)
-- Select the requested page of data.
select *
from NumbersWithRowNumber
where RowNumber between @PageSize * ( @PageNumber - 1 ) + 1 and @PageSize * @PageNumber
order by RowNumber