sqlserver随机取记录

sqlserver随机取记录,第1张

概述文章转载自:http://www.cnblogs.com/swtseaman/archive/2011/04/28/2031572.html sqlserver随机记录 2009年03月09日 星期一 下午 06:03 SqlServer本身并没有提供随机读取记录的功能,但我们可以通过一些方法来实现这个目的。本文介绍了其中几种方法并比较了各自的优劣。 方法一:      直接通过Sql语句实现,

文章转载自:http://www.cnblogs.com/swtseaman/archive/2011/04/28/2031572.HTML

sqlserver随机取记录

2009年03月09日 星期一 下午 06:03

sqlServer本身并没有提供随机读取记录的功能,但我们可以通过一些方法来实现这个目的。本文介绍了其中几种方法并比较了各自的优劣。

方法一:

     直接通过SQL语句实现,如:

  select top n * from tableA order by newID()   

这是最简单的方法,通过调用sqlServer的newID()函数(产生GUID—全局唯一标志符)来产生随机记录。

     采用这种方法时,需要将表中所有记录与newID()生成的值进行比较从而进行排序。因此,如果表中的记录较多, *** 作会非常缓慢。

方法二:

     假设表中有一个自增长主键,增量为1。这时我们可以这样处理,取出主键的边界值(最大值和最小值),然后通过一个算法得到介于(包括)两个边界之间的随机值,最后按照这个值取出对应记录。下面是C#的例子:

  //生成随机数     Random rand = new Random();     int num = rand.Next(MinVal,MaxVal + 1); //MinVal为主键的最小值,MaxVal为主键的最大值           //读取记录的sql字符串     string sqlStr = "select * from tableA where PK = " + num;   

这种方法较前一种方法的 *** 作速度有了较大提高(特别是在大数据量的情况下)。但只有当主键值是连续的,中间没有断开的情况,并且增量为1时才能用这种方法。那么,如何才能解决这个问题呢?请继续往下看。

方法三:

     对方法二进行了改进。主要思路是,将表中所有的主键值读进一个数组,从数组中随机读出一个值,按照这个值取出对应记录。下面是C#的例子:

  //将主键值读进ArrayList     ArrayList DataIndex = new ArrayList();     while (sdr.Read()) //sdr为存放所有主键值的sqlDataReader              DataIndex.Add(sdr[0]); //存入ArrayList               //从ArrayList中随机读取数据项     Random rand = new Random();     int num = Convert.ToInt32(DataIndex[rand.Next(DataIndex.Length)]);           //读取记录的sql字符串     string sqlStr = "select * from tableA where PK = " + num;   

这样不管主键是否为自增长字段,也不管数值是否连续,都能够应付自如了。经过笔者的测试,在数据量为50万的情况下代码运行速度几乎没有受到什么影响,可见ArrayList的 *** 作性能是可以信赖的。

总结

以上是内存溢出为你收集整理的sqlserver随机取记录全部内容,希望文章能够帮你解决sqlserver随机取记录所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1179824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存