日期:2014-05-17  浏览次数:21318 次

asp+SQLServer如何实现随机取数据,且取出的数据不重复
我写的代码如下,能够随机取数据,但会出现重复。

<%    

set   rs=conn.execute( "select   top   1   *   from   type2   order   by   id   desc ")
max2=rs( "id ")

for   i=1   to   max                       'max为要取多少条数据
randomize    
sid=int((max2+1)*rnd+1)    

set   rst=conn.execute( "select   *   from   type2   where   id= "&sid)    
while   rst.eof    
randomize    
   
sid=int((maxtype1+1)*rnd+1)    
set   rst=conn.execute( "select   *   from   type2   where   id= "&sid)    
while   rst.eof
   
wend    
%>    
    ...........................      
                    <%    
              next    
  %>    

希望能在我的程序上做些修改来实现,谢谢!

------解决方案--------------------
提供一个思路,把你的记录存入一个数组,然后取无重随机数,用随机数下标去调用数组中的记录
------解决方案--------------------
用这条
sql= "select top "&max& " * from type2 order by newid() "
代替你上面的.
newid()是SQL SERVER的一个函数..
------解决方案--------------------
提供一个思路
取得该表的记录总数total,然后在1到total中,取出max个不重复的随机数
接着用记录集rs.open sql,conn,3,1
用rs.move就可以移动到随机数的地方了


语法

recordset.Move NumRecords, Start

参数

NumRecords 带符号长整型表达式,指定当前记录位置移动的记录数。

Start 可选,字符串或变体型,用于计算书签。也可为下列 BookmarkEnum 值之一:

常量 说明
AdBookmarkCurrent 默认。从当前记录开始。
AdBookmarkFirst 从首记录开始。
AdBookmarkLast 从尾记录开始。


说明

所有 Recordset 对象都支持 Move 方法。

如果 NumRecords 参数大于零,则当前记录位置将向前移动(向记录集的末尾)。如果 NumRecords 小于零,则当前记录位置向后移动(向记录集的开始)。

如果 Move 调用将当前记录位置移动到首记录之前,则 ADO 将当前记录放置在记录集(BOF 为 True)的首记录之前。在 BOF 属性已经为 True 时试图向后移动将产生错误。

如果 Move 调用将当前记录位置移动到尾记录之后,则 ADO 将当前记录放置在记录集(EOF 为 True)的尾记录之后。在 EOF 属性已经为 True 时试图向前移动将产生错误。

从空的 Recordset 对象调用 Move 方法将产生错误。

如果传送 Start 参数,则移动相对于该书签的记录(假定 Recordset 对象支持书签)。如果没有指定,则移动相对于当前记录。

如果使用 CacheSize 属性在本地缓存来自提供者的记录,则在传送将当前记录位置移动到当前缓存的记录组之外的 NumRecords 参数时, ADO 将不得不从目标记录开始检索新的记录组。CacheSize 属性决定新检索记录组的大小,而目标记录是检索到的第一个记录。

如果 Recordset 对象是仅向前的,则用户仍然可以传送小于零的 NumRecords 参数(只要目标在已缓存记录的当前集合中)。如果 Move 调用将当前记录位置移动到第一个已缓存记录的前一个记录,将产生错误。因此可使用记录缓存,它在支持仅向前滚动的提供者上支持完全滚动。由于缓存的记录将加载到内存,因此应避免不必要地缓存过多记录。即使仅向前 Recordset 对象支持这种方式的向后移动,在任何仅向前的 Recordset 对象上调用 MovePrevious 方法仍将产生错误。